ノードが存在するかどうかに応じて設定された後、変数のリテラル文字列値を出力しようとしています。条件チェックのロジックは正しいと思います。しかし、値を出力していません...
<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」のいずれかのリテラル文字列を出力してほしい。しかし、何も出力していません。助けてください!ありがとうございました!!!
主な問題は、テンプレートの外部で宣言した変数が、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>
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