在xslt 1.0中减去我只得到最后一个节点的结果

时间:2017-06-25 21:43:31

标签: xml xslt

我仍然遇到xslt中的减法问题: 我的源代码是:

<?xml version="1.0" encoding="Windows-1250"?>
<RAKS_R3>
<EXPORT ID="1" EXPORT_DATE="2017-06-21">
<EVENTS_DOCUMENTS>
<ROW ID="202" DATE="2017-01-31" DOC_CODE="WST" DOC_NUMBER="WST 0001/17">
<EVENTS>
<ROW ID="204" EVENT_ID="205" EVENT_ACC_NUM="400-01-01" EVENT_TYPE="B">
<PRICE>
<ROW EVENT_PRICE="1333,23"/>
</PRICE>
</ROW>
<ROW ID="205" EVENT_ID="205" EVENT_ACC_NUM="400-01-01" EVENT_TYPE="P" >
<PRICE>
<ROW EVENT_PRICE="1376,06"/>
</PRICE>
</ROW>
<ROW ID="209" EVENT_ID="204" EVENT_ACC_NUM="400-01-01" EVENT_TYPE="B" >
<PRICE>
<ROW EVENT_PRICE="1676,19"/>
</PRICE>
</ROW>
<ROW ID="210" EVENT_ID="204" EVENT_ACC_NUM="400-01-01" EVENT_TYPE="P">
<PRICE>
<ROW EVENT_PRICE="1730,04"/>
</PRICE>
</ROW>
</EVENTS>
</ROW>
</EVENTS_DOCUMENTS>
</EXPORT>
</RAKS_R3>

Xslt 1.0是这样的:

   <?xml version="1.0" encoding="Windows-1250"?>
   <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output encoding="Windows-1250" method="xml"/>
   <xsl:strip-space elements="*"/>
   <xsl:key name="p" match="ROW[@EVENT_TYPE='P']" use="@EVENT_ID" />
   <xsl:template match="/">
    <xsl:element name="R">
      <xsl:element name="EXPORT">
        <xsl:attribute name="DATE_M"></xsl:attribute>
        <xsl:attribute name="VER">9</xsl:attribute>
        <xsl:element name="DOCUMENTS">
          <xsl:element name="DOCUMENT"> 

          <xsl:for-each select="RAKS_R3/EXPORT/EVENTS_DOCUMENTS/ROW">

            <xsl:attribute name="DOC_NUMBER"><xsl:value-of select="@DOC_NUMBER"/></xsl:attribute>

            <xsl:element name="DECRS">
            <xsl:for-each select="EVENTS">

              <xsl:element name="DECR">
              <xsl:for-each select="ROW[@EVENT_TYPE='B']">
                <xsl:attribute name="ID">
 <xsl:value-of select="position()" />
 </xsl:attribute>
                <xsl:attribute name="WN">
                    <xsl:value-of select="@EVENT_ACC_NUM"/>
                </xsl:attribute>
                <xsl:attribute name="MA">
                    <xsl:value-of select="'070-07'"/>
                </xsl:attribute>
                <xsl:attribute name="AMOUNT">


    <xsl:variable name="B" select="PRICE/ROW/@EVENT_PRICE"/>
    <xsl:variable name="P" select="key('p', EVENT_ID)/PRICE/ROW/@EVENT_PRICE"/>
    <xsl:variable name="Btrans" select="translate($B, ',', '.')" />
    <xsl:variable name="Ptrans" select="translate($P, ',', '.')" />
    <xsl:variable name="Diff" select="number($Btrans - $Ptrans)"/>

    <xsl:value-of select="$Diff" />

                </xsl:attribute>
                </xsl:for-each>
                <xsl:attribute name="AMOUNT2"></xsl:attribute>
              </xsl:element>
            </xsl:for-each>
            </xsl:element>             
          </xsl:for-each>  
          </xsl:element>
        </xsl:element>
      </xsl:element>
    </xsl:element>
    </xsl:template>


</xsl:stylesheet>

结果我得到了这个:

<?xml version="1.0" encoding="Windows-1250"?>
<R>
<EXPORT DATE_M="" VER="9">
<DOCUMENTS>
<DOCUMENT NUMBER_N="1" ID_INS="" ID_ACC_DOC="14" TYPE_DOC="WST" NAME_DOC="WST" SYMBOL="M" ACC_DATE="2017-01-31" DOC_NUMBER="WST 0001/17" DOC_DATE="2017-01-31" SELL_DATE="2017-01-31">
<DECRS>
<DECR ID="2" WN="400-01-01" MA="070-07" AMOUNT="-53.85" AMOUNT2=""/>
</DECRS></DOCUMENT>
</DOCUMENTS>
</EXPORT>
</R>

但我需要这样的事情:

<?xml version="1.0" encoding="Windows-1250"?>
<R>
<EXPORT DATE_M="" VER="9">
<DOCUMENTS>
<DOCUMENT NUMBER_N="1" ID_INS="" ID_ACC_DOC="14" TYPE_DOC="WST" NAME_DOC="WST" SYMBOL="M" ACC_DATE="2017-01-31" DOC_NUMBER="WST 0001/17" DOC_DATE="2017-01-31" SELL_DATE="2017-01-31">
<DECRS>
<DECR ID="1" WN="400-01-01" MA="070-07" AMOUNT="-42.83" AMOUNT2=""/>
<DECR ID="2" WN="400-01-01" MA="070-07" AMOUNT="-53.85" AMOUNT2=""/>
</DECRS></DOCUMENT>
</DOCUMENTS>
</EXPORT>
</R>

为什么我只从ID = 2的最后差异得到结果,其中ID = 1?谁能帮我??我第三次在这个论坛上写过,我从michael.hor257k(Subtract in xslt 1.0 with sorting nodes)得到了非常好的回答,但我仍然对这种转变有疑问。

0 个答案:

没有答案