使用这个 XPath 单线:
sum(((ea|pa)/@type | perf)[number()= number()])
基于 XSLT 1.0 的验证:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/*">
<xsl:copy-of select="sum(((ea|pa)/@type | perf)[number()= number()]) "/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于以下 XML 文档(提供的片段,包装在单个顶部元素中)时:
<t>
<ea type="null"/>
<pa type="null"/>
<perf>4</perf>
</t>
评估 XPath 表达式(使用顶部元素作为初始上下文节点),并将此评估的结果复制到输出:
4
如果所有元素的值都是非数字,例如:
<t>
<ea type="null"/>
<pa type="null"/>
<perf>I am a string</perf>
</t>
结果再次正确:
0
请注意:
当前选择的答案不包含语法上有效的 XSLT 1.0 转换,并且任何 XSLT 1.0 处理器(不是 XSLT 2.0 处理器)都会产生如下错误(使用 Saxon 6.5.4):
SAXON 6.5.4 from Michael Kay
Java version 1.6.0_31
Error at xsl:copy-of on line 12 of file:/(Untitled):
Error in expression sum( ( //ea[not(@type eq 'null')], //pa[not(@type eq 'null')], //perf[not(@type eq 'null')] ) ) : expected ")", found "<name>"
Transformation failed: Failed to compile stylesheet. 1 error detected.
Press any key to continue . . .