XSLT получить сопоставленные данные с разделителем запятых - PullRequest
0 голосов
/ 15 января 2010

У меня есть данные, как показано ниже:

<ProductAttributes>
<Attribute>
  <ItemCode>ITEM-0174676</ItemCode> 
  <AttributeCode>host_interface</AttributeCode> 
  <AttributeDescription>Host Interface</AttributeDescription> 
  <AttributeValueCode>usb</AttributeValueCode> 
  <AttributeValueDescription>USB</AttributeValueDescription> 
  <GroupCode>technical_information</GroupCode> 
  <GroupDescription>Technical Information</GroupDescription> 
  <GroupPostion /> 
  <DisplayInList>True</DisplayInList> 
  <GroupPosition>1</GroupPosition> 
  </Attribute>
<Attribute>
  <ItemCode>ITEM-0174676</ItemCode> 
  <AttributeCode>host_interface</AttributeCode> 
  <AttributeDescription>Host Interface</AttributeDescription> 
  <AttributeValueCode /> 
  <AttributeValueDescription>USB</AttributeValueDescription> 
  <GroupCode>technical_information</GroupCode> 
  <GroupDescription>Technical Information</GroupDescription> 
  <GroupPostion /> 
  <DisplayInList>True</DisplayInList> 
  <GroupPosition>1</GroupPosition> 
  </Attribute>
<Attribute>

Здесь выше xml <AttributeDescription> имеет одинаковый текст в обоих узлах <Attribute>, в этом случае я хочу отобразить результат, как показано ниже, который будет использовать узел <AttributeValueDescription>, поэтому результат будет

Интерфейс хоста: USB, USB

Так какая помощь для результата?

Заранее спасибо, Ом

Ответы [ 2 ]

2 голосов
/ 15 января 2010

Я предполагаю, что вы хотите HTML в качестве вывода.

Вам необходимо сгруппировать данные по <ItemCode>, <AttributeCode>. Это означает составной мюнхенский подход к группировке. Вам нужен этот ключ:

<xsl:key 
  name="AttributeByAttributeCode" 
  match="Attribute" 
  use="concat(ItemCode, '|', AttributeCode)" 
/>

Затем вы можете использовать ключ для группировки по <AttributeCode> в каждом <ProductAttributes>:

<xsl:template match="ProductAttributes">
  <!-- check every attribute… -->
  <xsl:for-each select="Attribute">

    <!-- …select all attributes that share the same item and attribute codes -->
    <xsl:variable name="EqualAttributes" select="
      key('AttributeByAttributeCode', concat(ItemCode, '|', AttributeCode))
    " />

    <!-- make sure output is generated for the first of them only -->
    <xsl:if test="generate-id() = generate-id($EqualAttributes[1])">
      <div>
        <xsl:value-of select="AttributeDescription" />
        <xsl:text>: </xsl:text>
        <!-- now make a list out of any attributes that are equal -->
        <xsl:apply-templates mode="list" select="
          $EqualAttributes/AttributeValueDescription
        " />
      </div>
    </xsl:if>
  </xsl:for-each>
</xsl:template>

<!-- generic template to make a comma-separated list out of input elements -->
<xsl:template match="*" mode="list">
  <xsl:value-of select="." />
  <xsl:if test="position() &lt; last()">
    <xsl:text>, </xsl:text>
  </xsl:if>
</xsl:template>

Вышеуказанное приведет к

<div>Host Interface: USB, USB</div>
1 голос
/ 15 января 2010

Чтобы создать строку, разделенную запятой, вы можете использовать следующий вопрос: Конкатная строка XSLT, удалите последнюю запятую

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...