0

输入:

<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 这样的解决方案应该包含如下的 for-each 结构。

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

<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>
4

1 回答 1

1

您实际上并不需要xsl:choose,只需一个 sum 语句即可对具有相同供应商代码(包括您所在的当前节点)的Item元素的所有Quantity元素求和。

<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 身份转换,因为这样会更加灵活。在这种情况下,您可能只需要一个与Quantity元素匹配的模板

试试这个 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>

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

于 2013-05-20T18:53:03.743 回答