この 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 . . .