[英]How to sort an XMl using XSLT 1.0?
我正在寻找一种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>
此转换 :
<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>
注意事项 :
使用Muenchian分组方法 。
密钥的使用允许对每个转码进行简单而有效的求和 。
身份规则用于按原样复制大多数元素,并且被匹配输出中会有所不同的元素的模板所覆盖。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.