我仍然遇到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)得到了非常好的回答,但我仍然对这种转变有疑问。