我有以下源XML
源XML
<?xml version="1.0" encoding="UTF-16"?>
<PropertySet><SiebelMessage><ListOfXRX_spcUSCO_spcCOL_spcInvoice_spcAR_spcSummary>
<FS_spcInvoice
Type_spcCode="20"
XCS_spcINQ_spcPO_spcNumber="7500020052"
XCS_spcINQ_spcSerial_spcNumber="VDR551061"
XCS_spcINQ_spcCustomer_spcNumber="712246305"
XCS_spcINQ_spcInvoice_spcNumber="060853967"
Gross_spcAmount="747.06"
Invoice_spcDate="04/01/2012"></FS_spcInvoice>
<FS_spcInvoice
Type_spcCode="20"
XCS_spcINQ_spcPO_spcNumber="7500020052"
XCS_spcINQ_spcSerial_spcNumber="VDR551061"
XCS_spcINQ_spcCustomer_spcNumber="712346305"
XCS_spcINQ_spcInvoice_spcNumber="063853967"
Gross_spcAmount="947.06"
Invoice_spcDate="04/01/2013"></FS_spcInvoice>
</ListOfXRX_spcUSCO_spcCOL_spcInvoice_spcAR_spcSummary></SiebelMessage></PropertySet>
我需要生成HTML格式的发票排序列表。我可以通过XSLT
帮助实现这一目标XSLT
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="/" >
<html><head></head><body>
<H3>Summary</H3>
<table>
<thead>
<tr><th>Invoice Number</th><th>Customer Number</th><th>Serial Number</th><th>PO Number</th><th>Invoice Date</th><th>Invoice Amount</th></tr>
</thead><tbody>
<xsl:apply-templates select="PropertySet/SiebelMessage/ListOfXRX_spcUSCO_spcCOL_spcInvoice_spcAR_spcSummary/FS_spcInvoice">
<xsl:sort select="@Gross_spcAmount" order="descending" />
</xsl:apply-templates>
<tr><td colspan="5">Total Amount</td><td></td></tr>
</tbody></table></body></html>
</xsl:template>
<xsl:template match='FS_spcInvoice'>
<tr>
<td><xsl:value-of select="@XCS_spcINQ_spcInvoice_spcNumber" /></td>
<td><xsl:value-of select="@XCS_spcINQ_spcCustomer_spcNumber" /></td>
<td><xsl:value-of select="@XCS_spcINQ_spcSerial_spcNumber" /></td>
<td><xsl:value-of select="@XCS_spcINQ_spcPO_spcNumber" /></td>
<td><xsl:value-of select="@Invoice_spcDate" /></td>
<td><xsl:value-of select="@Gross_spcAmount" /></td>
</tr>
</xsl:template>
</xsl:stylesheet>
我有两个问题
1。如何SUM?
我需要在表格的最后一行显示所有发票的总和。我有一个想法,我需要使用节点集,但我无法弄清楚如何?
2。动态排序
是否可以动态地向xsl:sort。
提供元素名称或属性名称例如,要排序的属性名称是作为不同的元素值提供的。
<sortby>Gross_spcAmount</sortby>
答案 0 :(得分:0)
(1)如何求和:使用内置的XPath库。
sum(/PropertySet/*/FS_spcInvoice)
如果存在任何被解决的数字实际上不是数字的风险,则存在细微差别,在这种情况下,通过包括不良值来破坏总和。这可以通过以下方式防止:
sum(/PropertySet/*/FS_spcInvoice[number(.)=number(.)])
...依赖于NaN
的{{1}}的属性。
(2)动态排序:尽管不优雅,但是你必须使用一个地址来表达排序字符串的计算,该地址构成了你正在寻找的节点,无论你需要什么变量值或地址。除了公开属性节点的名称并检查它之外,没有其他方法。
NaN != NaN