7

次のXMLがあるとしましょう

    <A>100</A>
    <B>200</B>
    <C>300</C>

および次のXSLT

  <TEST>
    <xsl:value-of select="A + B + C"/>
  </TEST>

次の出力が生成されます

<TEST>600</TEST>

ただし、ノードの1つが空白の場合

    <A></A>
    <B>200</B>
    <C>300</C>

私は次のようになります。

<TEST>NaN</TEST>

有効な番号であるノードのみを追加したい。xslで既存の変数に追加することで変数値を動的に置き換えることができれば、これを行うことができますが、それでも面倒です。私が行方不明になっている簡単な方法があると思いますか?

XSLT1.0の回答のみをお願いします。

ありがとう!

4

4 に答える 4

11
  <TEST>
    <xsl:value-of select="sum((A | B | C)[number(.) = .])"/>
  </TEST>

つまり、内容を数値として使用できる要素で構成される要素 A、B、C のサブセットを合計します。

number('')yieldsNaNおよび(NaN = NaN)false であるため、テキスト コンテンツのない要素は含まれないことに注意してください。

https://stackoverflow.com/a/3854389/423105で説明されているように、数値をテストします

于 2012-09-04T21:04:39.890 に答える
5

LarsHの答えの少しのバリエーション

sum((A|B|C)[number(.) = number(.)])

述語の式は、XPath 2.0 では型エラーを引き起こしません。これは、両方の引数が=同じ型 (xs:double) であるためです。

于 2012-09-05T02:03:01.513 に答える
3

もあります:

XSLT 1.0 の場合:

sum((A|B|C)[string(number())!='NaN'])

XSLT 2.0 の場合:

sum((A,B,C)[string(number())!='NaN'])

興味のある方は、もう 1 つあります。XSLT 1.0 と 2.0 の両方で機能します。

sum((A|B|C)[number()>-99999999])

上記の -99999999 を、可能な値の下限より 1 小さい値に置き換えます。NaN > anything は常に false を返すため、これは機能します。これはおそらくこれまでで最も効率的なソリューションですが、少し醜いと思われるかもしれません。

たとえば、A、B、C のいずれも負の値にならないことがわかっている場合は、次のように記述できます。

sum((A|B|C)[number()>0])

...少しきれいに見えますが、静かに読めます。

于 2012-09-05T04:41:50.820 に答える
2
<xsl:value-of select="sum(/root/*[self::A or self::B or self::C][.!=''])"/>

これにより、値が空白でない限り、「ルート」要素の下に A、B、および C の値が追加されます。

于 2012-09-04T19:57:26.427 に答える