1
<customer>
  <item>
    <BILLNO>1</BILLNO>
    <product>ABC</product>
    <AMT>20</AMT>
  </item>
  <item>
    <BILLNO>2</BILLNO>
    <product>GHK</product>
    <AMT>30</AMT>
  </item>
  <item>
    <BILLNO>1</BILLNO>
    <product>XYZ</product>
    <AMT>20</AMT>
  </item>
</customer>

xslt1.0 を使用して個別の値の総和を取得しようとしています。Muenchian メソッドを使用してこのような出力が必要です。各請求書には複数の製品があります。一日の終わりに、請求書の合計数と合計金額が必要です

<sales>
  <totalbills>2</totalbills>
  <totalamount>50</totalamount>
</sales>

助けてくれてありがとうラム

4

2 に答える 2

0

この短くて単純な変換 (no xsl:for-each、 no ..、no text()useage):

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

 <xsl:key name="kBills" match="item" use="BILLNO"/>

 <xsl:variable name="vdistItems" select=
  "/*/*[generate-id() = generate-id(key('kBills', BILLNO)[1])]"/>

 <xsl:template match="/*">
     <sales>
      <totalbills><xsl:value-of select="count($vdistItems)"/></totalbills>
      <totalamount><xsl:value-of select="sum($vdistItems/AMT)"/></totalamount>
     </sales>
 </xsl:template>
</xsl:stylesheet>

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

<customer>
  <item>
    <BILLNO>1</BILLNO>
    <product>ABC</product>
    <AMT>20</AMT>
  </item>
  <item>
    <BILLNO>2</BILLNO>
    <product>GHK</product>
    <AMT>30</AMT>
  </item>
  <item>
    <BILLNO>1</BILLNO>
    <product>XYZ</product>
    <AMT>20</AMT>
  </item>
</customer>

正確に必要な正しい結果が得られます。

<sales>
   <totalbills>2</totalbills>
   <totalamount>50</totalamount>
</sales>

解説:適切な使い方

  1. グループ化のためのMuenchian メソッド

  2. sum()関数. _

于 2012-04-15T14:00:26.903 に答える
0

この Xslt スタイルシート:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:output method="xml" indent="yes"/>

  <xsl:key name="item-key" match="item" use="BILLNO/text()"/>

  <xsl:template match="/customer">
    <root>
      <xsl:for-each select="item[generate-id() = generate-id(key('item-key', BILLNO/text()))]">
        <sales>
          <totalbills>
            <xsl:value-of select="count(../item[BILLNO = current()/BILLNO])"/>
          </totalbills>
          <totalamount>
            <xsl:value-of select="sum(../item[BILLNO = current()/BILLNO]/AMT)"/>
          </totalamount>
        </sales>
      </xsl:for-each>
    </root>
  </xsl:template>
</xsl:stylesheet>

次の出力をレンダリングします。

<?xml version="1.0" encoding="utf-8"?>
<root>
  <sales>
    <totalbills>2</totalbills>
    <totalamount>40</totalamount>
  </sales>
  <sales>
    <totalbills>1</totalbills>
    <totalamount>30</totalamount>
  </sales>
</root>
于 2012-04-15T05:49:42.943 に答える