1

私の入力XML:

<Citizens>
  <Category type="Plumbers">
    <Citizen>John</Citizen>
  </Category>
  <Category type="Doctors">
    <Citizen>Ram</Citizen>
    <Citizen>Kumar</Citizen>
  </Category>
  <Category type="Farmers">
    <Citizen>Ganesh</Citizen>
    <Citizen>Suresh</Citizen>
  </Category>
</Citizens>

Citizen私は次のXSLTを試してみました。Category

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="/">
        <xsl:variable name="citizenTotal" select="0" />
        <xsl:for-each select="Citizens/Category">
            <xsl:variable name="currentCount" select="count(Citizen)" />
            <xsl:variable name="citizenTotal" select="$citizenTotal+$currentCount" />
        </xsl:for-each>
        Total Citizen nodes: <xsl:value-of select="$citizenTotal"></xsl:value-of>
    </xsl:template>
</xsl:stylesheet>

予想される出力は 5 ですが、外部で開始された値である 0 を返しますfor-each。私は<xsl:variable/>その範囲が欠けている/いじっています。pageスコープがデフォルトであるJSLTで通常行うことを試しました。XSLT で変数のスコープについて言及するために、XSLT でそのようなものはありますか?

4

2 に答える 2

4

XSL 1.0 では、グローバル変数をインクリメントできません。このようなことを達成することができます

    <xsl:for-each select="Citizens/Category">
        <xsl:if test="position()=last()">
             Total Citizen nodes: <xsl:value-of select="position()"/>
       </xsl:if>
    </xsl:for-each>

ただし、XSLT 2.0 では、名前空間にSaxonを使用することでグローバル変数を使用できます。

<xsl:stylesheet version="2.0" 
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
            xmlns:saxon="http://saxon.sf.net/" extension-element-prefixes="saxon"
            exclude-result-prefixes="saxon">

変数の作成

<xsl:variable name="count" saxon:assignable="yes" select="0"/>

インクリメント

<saxon:assign name="count"><xsl:value-of select="$count+1"/></saxon:assign>
于 2013-07-15T06:38:08.733 に答える
1

問題は、変数が xslt で不変であることです。設定後は変更できません。

したがって、citizenTotal = 0 を割り当てます。for-each で同じ名前の変数を別の「割り当て」にしますが、実際には、そのループ サイクルのスコープで新しい変数を宣言しています。for-each を終了すると、その範囲外になります。そのループの前に宣言した変数だけが取得され、ゼロに設定されます。

すべての市民の総数が必要な場合は、xpath を使用して循環せずに実行できますcount(//Citizens/Category/Citizen)

于 2013-07-15T06:38:19.543 に答える