我正在寻找一种XSL,用于按一个节点对XML进行排序和分组,并按另一个节点求和。我将不得不使用XSLT 1.0。
这是我的XML。在排序之后,我需要对新的XML进行排序,并按<TransCode>分组,并且应该对每个组的所有<TransAmt>求和。我正在为这个任务寻找XSL。任何帮助都是非常感谢的。排序后,新的XML应该只有三个节点按<TransCode>的升序排序。所有的<TransAmt>必须加在一起。
下面是我的XML:
<Transactions>
<Transaction>
<TransCode>0008</TransCode>
<TransType>Purchase</TransType>
<TransAmt>12.30</TransAmt>
</Transaction>
<Transaction>
<TransCode>0002</TransCode>
<TransType>Cash</TransType>
<TransAmt>26.00</TransAmt>
</Transaction>
<Transaction>
<TransCode>0008</TransCode>
<TransType>Purchase</TransType>
<TransAmt>25.00</TransAmt>
</Transaction>
<Transaction>
<TransCode>0015</TransCode>
<TransType>FinanceCharge</TransType>
<TransAmt>25.00</TransAmt>
</Transaction>
<Transaction>
<TransCode>0002</TransCode>
<TransType>Cash</TransType>
<TransAmt>50.00</TransAmt>
</Transaction>
<Transaction>
<TransCode>0008</TransCode>
<TransType>Purchase</TransType>
<TransAmt>40.00</TransAmt>
</Transaction>
</Transactions>发布于 2010-08-16 03:21:31
此转换
<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="kTransByCode"
match="Transaction" use="TransCode"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/Transactions">
<Transactions>
<xsl:apply-templates select=
"Transaction[generate-id()
=
generate-id(key('kTransByCode',
TransCode
)[1]
)
]
">
<xsl:sort select="TransCode" data-type="number"/>
</xsl:apply-templates>
</Transactions>
</xsl:template>
<xsl:template match="TransAmt">
<TransAmt>
<xsl:value-of select=
"sum(key('kTransByCode',../TransCode)/TransAmt)"/>
</TransAmt>
</xsl:template>
</xsl:stylesheet>在所提供的XML文档上应用时的
<Transactions>
<Transaction>
<TransCode>0008</TransCode>
<TransType>Purchase</TransType>
<TransAmt>12.30</TransAmt>
</Transaction>
<Transaction>
<TransCode>0002</TransCode>
<TransType>Cash</TransType>
<TransAmt>26.00</TransAmt>
</Transaction>
<Transaction>
<TransCode>0008</TransCode>
<TransType>Purchase</TransType>
<TransAmt>25.00</TransAmt>
</Transaction>
<Transaction>
<TransCode>0015</TransCode>
<TransType>FinanceCharge</TransType>
<TransAmt>25.00</TransAmt>
</Transaction>
<Transaction>
<TransCode>0002</TransCode>
<TransType>Cash</TransType>
<TransAmt>50.00</TransAmt>
</Transaction>
<Transaction>
<TransCode>0008</TransCode>
<TransType>Purchase</TransType>
<TransAmt>40.00</TransAmt>
</Transaction>
</Transactions>生成所需的、正确的结果
<Transactions>
<Transaction>
<TransCode>0002</TransCode>
<TransType>Cash</TransType>
<TransAmt>76</TransAmt>
</Transaction>
<Transaction>
<TransCode>0008</TransCode>
<TransType>Purchase</TransType>
<TransAmt>77.3</TransAmt>
</Transaction>
<Transaction>
<TransCode>0015</TransCode>
<TransType>FinanceCharge</TransType>
<TransAmt>25</TransAmt>
</Transaction>
</Transactions>注意到
发布于 2010-08-16 00:17:12
XSL内置了通过元素进行排序和使用XPath sum函数求和的功能。
在XSLT 1.0中都支持这两种方法。
您在使用这些工具时遇到了什么问题?
https://stackoverflow.com/questions/3488160
复制相似问题