[英]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.