我有一个xsl样式表,只提供所需内容,除了标签外输出的值,。有没有办法删除它们?方案是所需的输出是出现多次的发票的总发票金额。每次执行xslt时,参数p1都包含InvoiceNumber为total。下面的代码显示参数p1硬编码为'351510'。
<?xml version="1.0" encoding="utf-8"?>
<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:template match="/Invoices/Invoice[InvoiceNumber=351510][1]/InvoiceNumber">
<xsl:copy>
<xsl:apply-templates select="/Invoices/Invoice[InvoiceNumber=351510][1]/InvoiceAmount"/>
</xsl:copy>
</xsl:template>
<xsl:param name="tempvar"/>
<xsl:template name="InvTotal" match="/Invoices/Invoice[InvoiceNumber=351510][1]/InvoiceNumber">
<xsl:variable name="p1" select="351510" />
<xsl:if test="/Invoices/Invoice/InvoiceNumber[. = $p1]">
<!--<xsl:if test="$test = $p1" >-->
<InvoiceAmount>
<xsl:value-of select="sum(../../Invoice[InvoiceNumber=351510]/InvoiceAmount)"/>
</InvoiceAmount>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
这是输入:
<Invoices>
- <Invoice>
<InvoiceNumber>351510</InvoiceNumber>
<InvoiceAmount>137.00</InvoiceAmount>
</Invoice>
- <Invoice>
<InvoiceNumber>351510</InvoiceNumber>
<InvoiceAmount>363.00</InvoiceAmount>
</Invoice>
- <Invoice>
<InvoiceNumber>351511</InvoiceNumber>
<InvoiceAmount>239.50</InvoiceAmount>
</Invoice>
</Invoices>
这是输出:
<InvoiceAmount>500</InvoiceAmount>137.00351510363.00351511239.50
这是期望的输出:
<InvoiceAmount>500</InvoiceAmount>
另外,谢谢你让我这么做的lwburk。
答案 0 :(得分:1)
添加
<xsl:template match="text()"/>
应该有帮助。
答案 1 :(得分:1)
我没有得到与您发布的结果相同的结果(仅351510137.00351510363.00351511239.50
,所有文本节点),我不知道tempvar
(未使用)的目的。
由于看起来您需要的只是特定InvoiceAmount
的{{1}}值的总和,所以请保持简单并忽略其他所有内容:
InvoiceNumber
您可以通过参数<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="invoiceNumber"/>
<xsl:template match="/">
<InvoiceAmount>
<xsl:value-of select="sum(/Invoices/Invoice[InvoiceNumber=$invoiceNumber]/InvoiceAmount)"/>
</InvoiceAmount>
</xsl:template>
</xsl:stylesheet>
传递InvoiceNumber进行处理,或者如果您愿意,可以对其进行硬编码(参见版本1)。
注意:您是否更喜欢数字格式,例如求和的invoiceNumber
(固定小数),然后您也可以使用format-number(…)
function。
答案 2 :(得分:1)
此转化:
<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:param name="pNum" select="351510"/>
<xsl:key name="kInvAmmtByNumber" match="InvoiceAmount"
use="../InvoiceNumber"/>
<xsl:variable name="vInvoiceAmounts" select=
"key('kInvAmmtByNumber', $pNum)"/>
<xsl:variable name="vIdInvAmount1" select=
"generate-id($vInvoiceAmounts[1])"/>
<xsl:template match="InvoiceAmount">
<xsl:if test="generate-id() = $vIdInvAmount1">
<InvoiceAmount>
<xsl:value-of select="sum($vInvoiceAmounts)"/>
</InvoiceAmount>
</xsl:if>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
应用于提供的XML文件:
<Invoices>
<Invoice>
<InvoiceNumber>351510</InvoiceNumber>
<InvoiceAmount>137.50</InvoiceAmount>
</Invoice>
<Invoice>
<InvoiceNumber>351510</InvoiceNumber>
<InvoiceAmount>362.50</InvoiceAmount>
</Invoice>
<Invoice>
<InvoiceNumber>351511</InvoiceNumber>
<InvoiceAmount>239.50</InvoiceAmount>
</Invoice>
</Invoices>
产生完全正确的结果:
<InvoiceAmount>500</InvoiceAmount>
<强>解释强>:
将所需发票号作为外部/全局参数$pNum
的值传递给转换。
我们使用一个键,通过相应的InvoiceAmount
值对所有InvoiceNumber
元素编制索引。
使用该键,我们定义包含所有$vInvoiceAmounts
元素的节点集的变量InvoiceAmount
,其对应的InvoiceNumber
元素的值与值相同外部参数$pNum
。
我们还定义了一个变量($vIdInvAmount1
),其中包含第一个此类InvoiceAmount
元素的唯一ID。
有一个模板匹配任何InvoiceAmount
元素。它检查匹配的元素是否是节点集$vInvoiceAmounts
中包含的第一个元素。如果是,则生成InvoiceAmount
元素,其中包含单个文本节点子元素,其值为InvoiceAmount
中包含的所有$vInvoiceAmounts
元素的总和。否则什么也没做。
最后,还有第二个模板匹配任何文本节点并且什么也不做(在输出中删除它),有效地覆盖了默认XSLT处理的不必要的副作用 - 输出不需要的文本。