执行XSLT逻辑

时间:2013-05-20 18:35:53

标签: xslt

输入:

<Move-Afile>
  <Afile>
    <Item>
    <suppliercode>1</suppliercode>
      <PackNumber>1234</PackNumber>
      <Item85>
      <Quantity>12</Quantity>
      </Item85>
    </Item>
    <Item>
    <suppliercode>2</suppliercode>
      <PackNumber>567</PackNumber>
      <Item85>
      <Quantity>3</Quantity>
      </Item85>
    </Item>
    <Item>
    <suppliercode>1</suppliercode>
      <PackNumber>567</PackNumber>
      <Item85>
      <Quantity>8</Quantity>
        </Item85>
    </Item>
    <Item>
    <suppliercode>3</suppliercode>
      <PackNumber>126</PackNumber>
       <Item85>
      <Quantity>11</Quantity>
       </Item85>
    </Item>
    <Item>
    <suppliercode>4</suppliercode>
      <PackNumber>876</PackNumber>
       <Item85>
      <Quantity>32</Quantity>
       </Item85>
    </Item>
  </Afile>
</Move-Afile>

XSLT:

我需要xsl应该包含的解决方案,如下所示。

如果供应商代码相等,那么我们必须对这些节点的数量值求和,否则直接映射数量值。

<xsl:for-each select="/Move-Afile/Afile/Item">

  <xsl:choose>
  <xsl:when test="suppliercode=suppliercode>

  <xsl:value-of select=sum(Quantity)"/><!-- sum of quantity where nodes have equal supplier  code-->
  </xsl:when>

  <xsl:otherwise>

  <xsl:value-of select="Quantity"/><!-- map directly the quantity value-->

  </xsl:otherwise>

  </xsl:choose>

  </xsl:for-each>

输出:

<A>
   <target>
      <Item>

         <Quantity>20</Quantity>
      </Item>
      <Item>

         <Quantity>3</Quantity>
      </Item>
      <Item>

         <Quantity>20</Quantity>
      </Item>
      <Item>

         <Quantity>11</Quantity>
      </Item>
      <Item>

         <Quantity>32</Quantity>
      </Item>
   </target>
</A>

1 个答案:

答案 0 :(得分:1)

这里不需要 xsl:choose ,只需要一个sum语句来汇总 Item 元素的所有数量元素相同的供应商代码(包括您所在的当前节点)。

<xsl:value-of select="sum(//Item[suppliercode = current()/suppliercode]/Item85/Quantity)"/>

但是,使用键来查找匹配的 Item 元素会更有效:

<xsl:key name="Item" match="Item" use="suppliercode" />

然后将sum语句简化为此

<xsl:value-of select="sum(key('Item', suppliercode)/Item85/Quantity)"/>

您可能还想考虑在构建输出XML时使用XSLT标识转换,因为这样会更灵活。在这种情况下,您可能只需要一个匹配数量元素的模板

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:key name="Item" match="Item" use="suppliercode" />

   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="Quantity">
      <xsl:copy>
         <xsl:value-of select="sum(key('Item', ../../suppliercode)/Item85/Quantity)"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

应用于XML时,输出以下内容

<Move-Afile>
    <Afile>
        <Item>
            <suppliercode>1</suppliercode>
            <PackNumber>1234</PackNumber>
            <Item85>
                <Quantity>20</Quantity>
            </Item85>
        </Item>
        <Item>
            <suppliercode>2</suppliercode>
            <PackNumber>567</PackNumber>
            <Item85>
                <Quantity>3</Quantity>
            </Item85>
        </Item>
        <Item>
            <suppliercode>1</suppliercode>
            <PackNumber>567</PackNumber>
            <Item85>
                <Quantity>20</Quantity>
            </Item85>
        </Item>
        <Item>
            <suppliercode>3</suppliercode>
            <PackNumber>126</PackNumber>
            <Item85>
                <Quantity>11</Quantity>
            </Item85>
        </Item>
        <Item>
            <suppliercode>4</suppliercode>
            <PackNumber>876</PackNumber>
            <Item85>
                <Quantity>32</Quantity>
            </Item85>
        </Item>
    </Afile>
</Move-Afile>

如果您确实想要更改或删除其他元素,只需为每个案例添加单独的模板。