0

以下の入力では、サプライヤ コードがノード サプライヤ コードのいずれかと一致するかどうかを確認する必要があります。それから、Quantity で合計操作を実行する必要があります。それ以外の場合は、数量を直接マッピングします。

入力:

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

サプライヤ コードが等しい場合は、数量に対して合計演算を実行します。そうでない場合は、数量を直接マップします。

出力:

<A>
  <target>
    <Item>
    <suppliercode>1</suppliercode>
      <PackNumber>1234</PackNumber>
      <Quantity>20</Quantity>
    </Item>
    <Item>
    <suppliercode>2</suppliercode>
      <PackNumber>567</PackNumber>
      <Quantity>3</Quantity>
    </Item>
    <Item>
    <suppliercode>1</suppliercode>
      <PackNumber>567</PackNumber>
      <Quantity>20</Quantity>
    </Item>
    <Item>
    <suppliercode>3</suppliercode>
      <PackNumber>126</PackNumber>
      <Quantity>11</Quantity>
    </Item>
    <Item>
    <suppliercode>4</suppliercode>
      <PackNumber>876</PackNumber>
      <Quantity>32</Quantity>
    </Item>
  </target>
</A>

以下のような別の一時変数に合計ロジックが必要です。

<varaible name=tempvar>
<xsl:choose>
<xsl:when suppliercode=suppliercode>

<xsl:value-of select=sum(quntity)/>

<xsl:when>

<xsl:otherwise>

<xsl:value-of select=quntity/>

</xsl:otherwise>

</xsl:choose>

</variable>
4

2 に答える 2

0

このスタイルシートは、必要なことを行います。すべての要素を下からコピーし、 の同じ値を持つ要素からすべての要素の値を追加して のItem値を変更する特別なテンプレートを持っています。QuantityQuantityItemsuppliercode

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:strip-space elements="*"/>
  <xsl:output method="xml" indent="yes" encoding="UTF-8" omit-xml-declaration="yes"/>

  <xsl:template match="/">
    <A>
      <target>
        <xsl:apply-templates select="Move-Afile/Afile/Item"/>
      </target>
    </A>
  </xsl:template>

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

  <xsl:template match="Quantity">
    <xsl:variable name="supplier-code" select="parent::Item/suppliercode"/>
    <xsl:copy>
      <xsl:value-of select="sum(ancestor::Afile/Item[suppliercode = $supplier-code]/Quantity)"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

出力

<A>
   <target>
      <Item>
         <suppliercode>1</suppliercode>
         <PackNumber>1234</PackNumber>
         <Quantity>20</Quantity>
      </Item>
      <Item>
         <suppliercode>2</suppliercode>
         <PackNumber>567</PackNumber>
         <Quantity>3</Quantity>
      </Item>
      <Item>
         <suppliercode>1</suppliercode>
         <PackNumber>567</PackNumber>
         <Quantity>20</Quantity>
      </Item>
      <Item>
         <suppliercode>3</suppliercode>
         <PackNumber>126</PackNumber>
         <Quantity>11</Quantity>
      </Item>
      <Item>
         <suppliercode>4</suppliercode>
         <PackNumber>876</PackNumber>
         <Quantity>32</Quantity>
      </Item>
   </target>
</A>

更新 合計を使用する前に変数に入れるには、最後のテンプレートをこれに置き換えることができます

  <xsl:template match="Quantity">
    <xsl:variable name="supplier-code" select="parent::Item/suppliercode"/>
    <xsl:variable name="total" select="sum(ancestor::Afile/Item[suppliercode = $supplier-code]/Quantity)"/>
    <xsl:copy>
      <xsl:value-of select="$total"/>
    </xsl:copy>
  </xsl:template>

の値を$total、同じサプライヤ コードの数量の合計に設定します。

于 2013-05-19T17:00:43.427 に答える
0

この短くて効率的な (キーを使用した) 変換:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kQuantityBySupplier" match="Quantity" use="../suppliercode"/>

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

 <xsl:template match="/*">
  <A>
    <target>
      <xsl:apply-templates select="*/node()"/>
    </target>
  </A>
 </xsl:template>

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

提供された XML ドキュメントに適用した場合:

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

必要な正しい結果が生成されます

<A>
   <target>
      <Item>
         <suppliercode>1</suppliercode>
         <PackNumber>1234</PackNumber>
         <Quantity>20</Quantity>
      </Item>
      <Item>
         <suppliercode>2</suppliercode>
         <PackNumber>567</PackNumber>
         <Quantity>3</Quantity>
      </Item>
      <Item>
         <suppliercode>1</suppliercode>
         <PackNumber>567</PackNumber>
         <Quantity>20</Quantity>
      </Item>
      <Item>
         <suppliercode>3</suppliercode>
         <PackNumber>126</PackNumber>
         <Quantity>11</Quantity>
      </Item>
      <Item>
         <suppliercode>4</suppliercode>
         <PackNumber>876</PackNumber>
         <Quantity>32</Quantity>
      </Item>
   </target>
</A>

注意してください:

この変換の時間計算量は線形 (O(N)) です。suppliercodeこれは、すべての要素を繰り返しスキャンして、二次 (O(N^2)) 時間の複雑さを持つ特定の要素を見つけるよりも桁違いに効率的です。


更新

OP は、合計または単一の数量を変数に取り込むという新しい要件を指定しました。

これを変更するだけです:

 <xsl:template match="Quantity/text()">
  <xsl:value-of select="sum(key('kQuantityBySupplier', ../../suppliercode))"/>
 </xsl:template>

これに

 <xsl:template match="Quantity/text()">
  <xsl:variable name="vSum" select="sum(key('kQuantityBySupplier', ../../suppliercode))"/>
  <xsl:value-of select="$vSum"/>
 </xsl:template>
于 2013-05-19T17:19:57.167 に答える