XSLT - 基于属性值的Sum

时间:2013-08-12 22:08:27

标签: xslt

我有以下源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>

1 个答案:

答案 0 :(得分:0)

(1)如何求和:使用内置的XPath库。

sum(/PropertySet/*/FS_spcInvoice)

如果存在任何被解决的数字实际上不是数字的风险,则存在细微差别,在这种情况下,通过包括不良值来破坏总和。这可以通过以下方式防止:

sum(/PropertySet/*/FS_spcInvoice[number(.)=number(.)])

...依赖于NaN的{​​{1}}的属性。

(2)动态排序:尽管不优雅,但是你必须使用一个地址来表达排序字符串的计算,该地址构成了你正在寻找的节点,无论你需要什么变量值或地址。除了公开属性节点的名称并检查它之外,没有其他方法。

NaN != NaN