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:

以下のような for-each 構造を 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>
4

1 に答える 1

1

ここでxsl:chooseは実際には必要ありません。単一の sum ステートメントだけで、同じSuppliercode (現在のノードを含む) を持つItem要素のすべてのQuantity要素を合計できます。

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

ただし、キーを使用して一致するItem要素を探す方が効率的です。

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

次に、合計ステートメントは次のように簡略化されます

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

また、出力 XML を作成する際に XSLT ID 変換を使用することを検討することもできます。この方が柔軟性が高いからです。この場合、 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 に答える