この行に問題があります:
<xsl:param name="test" select="Jane"/>
これは、xsl:param
namedtest
を定義します。その値は、現在のノード ('/') named の子要素ですJane
。最上位の要素はであり、 では<product>
ない<Jane>
ため、test
パラメーターには空のノード セットの値 (および文字列値 -- 空の文字列) が含まれます。
あなたが望む(周囲のアポストロフィに注意してください):
<xsl:param name="test" select="'Jane'"/>
処理タスク全体はかなり簡単に実装できます。
この XSLT 1.0 変換:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pTest" select="'Jane'"/>
<xsl:template match="title">
<xsl:choose>
<xsl:when test="contains(., $pTest)">
<h2>
<xsl:value-of select="substring-before(., '/')"/>
</h2>
<p>
<xsl:value-of select="substring-after(., '/')"/>
</p>
</xsl:when>
<xsl:otherwise>
<h2><xsl:value-of select="."/></h2>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
提供された XML ドキュメントに適用した場合:
<product>
<title>The Maze / Jane Evans</title>
</product>
必要な正しい結果が生成されます。
<h2>The Maze </h2>
<p> Jane Evans</p>
説明:
XSLT 1.0 構文では、一致パターンでの変数/パラメーターの参照が禁止されています。これが、any に一致する単一のテンプレートtitle
を用意し、特定の希望する方法で処理するための条件をテンプレート内で指定する理由です。
XSLT 2.0 ソリューション:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pTest" select="'Jane'"/>
<xsl:template match="title[contains(., $pTest)]">
<h2>
<xsl:value-of select="substring-before(., '/')"/>
</h2>
<p>
<xsl:value-of select="substring-after(., '/')"/>
</p>
</xsl:template>
<xsl:template match="title">
<h2><xsl:value-of select="."/></h2>
</xsl:template>
</xsl:stylesheet>
この変換が提供された XML ドキュメント (上記) に適用されると、同じように正しい結果が生成されます。
<h2>The Maze </h2>
<p> Jane Evans</p>
説明:
XSLT 2.0 には XSLT 1.0 の制限がなく、一致パターン内で変数/パラメーター参照を使用できます。