如何使用XSLT1.0对XMl进行排序?
我正在寻找一种XSL,它可以按一个节点对XML进行排序和分组,并按另一个节点求和。我将不得不使用XSLT1.0 这是我的XML。 排序后,我需要将一个新的XML按如何使用XSLT1.0对XMl进行排序?,xml,xslt,sorting,using,Xml,Xslt,Sorting,Using,我正在寻找一种XSL,它可以按一个节点对XML进行排序和分组,并按另一个节点求和。我将不得不使用XSLT1.0 这是我的XML。 排序后,我需要将一个新的XML按进行排序和分组,并且所有都应该为每个组求和。我正在寻找这个任务的XSL。感谢您的帮助。排序后,新XML应该只有三个节点按照的升序排序。必须将所有的添加到一起 以下是我的XML: <Transactions> <Transaction> <TransCode>0008</TransCode&
进行排序和分组,并且所有
都应该为每个组求和。我正在寻找这个任务的XSL。感谢您的帮助。排序后,新XML应该只有三个节点按照
的升序排序。必须将所有的
添加到一起
以下是我的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>
0008
购买
12.30
0002
现金
26
0008
购买
25
0015
财务费用
25
0002
现金
50
0008
购买
40
XSL内置了元素排序和使用XPath函数求和
XSLT1.0支持这两种方法
您在使用这些时遇到了哪些问题?此转换:
<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>
<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>
应用于提供的XML文档时:
<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>
<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>
0008
购买
12.30
0002
现金
26
0008
购买
25
0015
财务费用
25
0002
现金
50
0008
购买
40
生成所需的正确结果:
<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>
<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>
0002
现金
76
0008
购买
77.3
0015
财务费用
25
注意事项:
<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>
<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>
您是否要求我们为您编写XSL?也许您可以发布您提出的XSL,并告诉我们您在使用它时遇到了哪些问题?您想要的输出文档的示例也有助于回答问题。好问题(+1)。请参阅我的答案,以获得完整而有效的解决方案以及对关键思想的解释。:)+回答得好!但是,我认为如果您匹配“同类中的第一个”
Transaction
和TransAmt/text()。我这样说是因为有些人抱怨XSLT过于冗长。