web-dev-qa-db-ja.com

<xsl:variable> <xsl:value-of>を使用してXSL変数の値を出力します

ノードが存在するかどうかに応じて設定された後、変数のリテラル文字列値を出力しようとしています。条件チェックのロジックは正しいと思います。しかし、値を出力していません...

<xsl:variable name="subexists"/>

<xsl:template match="class">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
<xsl:choose>
    <xsl:when test="joined-subclass">
        <xsl:variable name="subexists" select="'true'"/>
    </xsl:when>
    <xsl:otherwise>
        <xsl:variable name="subexists" select="'false'"/>
    </xsl:otherwise>
</xsl:choose>
subexists:  <xsl:value-of select="$subexists" />

「true」または「false」のいずれかのリテラル文字列を出力してほしい。しかし、何も出力していません。助けてください!ありがとうございました!!!

17
tomato

主な問題は、テンプレートの外部で宣言した変数が、chooseステートメント内で「設定」されているのと同じ変数であると考えることです。これはXSLTの仕組みではなく、変数を再割り当てすることはできません。これはあなたが望むものに似ています:

<xsl:template match="class">
  <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
  <xsl:variable name="subexists">
    <xsl:choose>
      <xsl:when test="joined-subclass">true</xsl:when>
      <xsl:otherwise>false</xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  subexists:      <xsl:value-of select="$subexists" />
</xsl:template>

また、変数に「グローバル」スコープを設定する必要がある場合は、テンプレートの外で変数を宣言します。

<xsl:variable name="subexists">
  <xsl:choose>
     <xsl:when test="/path/to/node/joined-subclass">true</xsl:when>
     <xsl:otherwise>false</xsl:otherwise>
  </xsl:choose>
</xsl:variable>

<xsl:template match="class">
   subexists:      <xsl:value-of select="$subexists" />
</xsl:template>
7
eddiegroves

XSLTでも同じ <xsl:variable> は一度しか宣言できず、宣言時にのみ値を指定できます。複数の変数が同時に宣言されている場合、それらは実際には異なる変数であり、異なるスコープを持っています。

したがって、変数の必要な条件付き設定を達成し、その値を生成する方法は次のとおりです。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>

    <xsl:template match="class">
    <xsl:variable name="subexists">
            <xsl:choose>
                <xsl:when test="joined-subclass">true</xsl:when>
                <xsl:otherwise>false</xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        subexists:  <xsl:text/>    
        <xsl:value-of select="$subexists" />
    </xsl:template>
</xsl:stylesheet>

上記の変換が次のXMLドキュメントに適用される場合

<class>
 <joined-subclass/>
</class>

希望する結果が生成されます

    subexists:  true
6