3

私は次のXML構造を持っています:

  <example>
    <data>
       <numberGer>3,40</numberGer>
    </data>
    <data>
      <numberGer>7,40</numberGer>
    </data>
    <data>
       <numberGer>17,40</numberGer>
    </data>
  </example>

すべての「numberGer」ノードの合計が必要です。番号のフォーマットが問題です。「、」を使用しているため、関数「sum」はエラーを生成します。したがって、sum(// numberGer)のようなものは機能しません。XSLT2.0関数を使用できます。

計算値とノードのリストを取得する再帰テンプレートを作成する必要があると思います。

何かのようなもの:

<xsl:template name="addGerNumbers">
        <xsl:param name="number"/>
        <xsl:param name="nodes"/>
      <xsl:choose>
        <xsl:when test="$nodes">
          <xsl:variable name="recursive_result">
            ...
           <xsl:call-template name="addGerNumbers">
             ...
            </xsl:call-template>
            </xsl:variable>
          <xsl:value-of select="$number + $recursive_result"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="0"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:template>

最後に、結果として単一の値が必要になります。

XSL for-eachループ内の以前のすべてのノードをXPathsum()する方法は?最後に1つの番号が必要なため、機能しません。

4

3 に答える 3

2

XPath2.0式は1つで十分です。

<xsl:value-of select="sum( for $i in //numberGer return number(translate( $i, ',','.') ) )"/>

ループはfor各値を変換してコンマをドットに置き換え、次にそれらを数値に変換します。これは、通常どおり合計できる一連の数値を返します。

于 2012-06-08T10:03:16.313 に答える
1

おそらく、最も短く/最も単純で最も正確なXPath 2.0ワンライナー

sum(/*/*/numberGer/xs:decimal(translate(., ',', '.')))
于 2012-06-08T11:57:51.113 に答える
1

XSLT 2.0を使用している場合はsum()、入力XMLに簡単に適用できます。例えば:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
    <xsl:output indent="yes"/>
    <xsl:template match="/">
        <xsl:variable name="numbers" as="xs:double*">
            <xsl:for-each select="example/data/numberGer">
                <xsl:sequence select="number(translate(., ',', '.'))"/>
            </xsl:for-each>
        </xsl:variable>
        <result>
            <xsl:value-of select="sum($numbers)"/>
        </result>
    </xsl:template>
</xsl:stylesheet>

XSLTは以下を生成します。

<?xml version="1.0" encoding="UTF-8"?>
<result>28.2</result>
于 2012-06-08T10:09:49.870 に答える