你在这一行有问题:
<xsl:param name="test" select="Jane"/>
这定义了一个xsl:param
named test
,其值是当前节点 ('/') 的子元素 named Jane
。由于顶部元素 is<product>
和 not <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 语法禁止在匹配模式中引用变量/参数。这就是为什么我们有一个匹配任何模板的单一模板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 的限制,并且可以在匹配模式中使用变量/参数引用。