我正在尝试从xsl:param中检索属性值,并在xsl:if测试条件中使用它。 所以给出以下xml
<product>
<title>The Maze / Jane Evans</title>
</product>
和xsl
<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="test" select="Jane"/>
<xsl:template match="title[contains(., (REFERENCE THE SELECT ATTRIBUTE IN PARAM))]">
<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>
我想回来
The Maze
Jane Evans
答案 0 :(得分:3)
您遇到问题:
<xsl:param name="test" select="Jane"/>
这定义了一个名为xsl:param
的{{1}},其值是当前节点('/')的名为test
的子元素。由于top元素是Jane
而不是<product>
,<Jane>
参数的值为空节点集(以及字符串值 - 空字符串)。
你想要(注意周围的撇号):
test
整个处理任务可以很容易地实施:
此XSLT 1.0转换:
<xsl:param name="test" select="'Jane'"/>
应用于提供的XML文档:
<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>
生成想要的正确结果:
<product>
<title>The Maze / Jane Evans</title>
</product>
<强>解释强>:
XSLT 1.0语法禁止匹配模式中的变量/参数引用。这就是为什么我们有一个匹配任何<h2>The Maze </h2>
<p> Jane Evans</p>
的模板,我们在模板中指定了以特定的,想要的方式处理的条件。
XSLT 2.0解决方案:
title
当在提供的XML文档(上面)上应用此转换时,再次生成相同的想要的正确结果:
<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>
<强>解释强>:
XSLT 2.0没有XSLT 1.0的限制,并且在匹配模式中可以使用 的变量/参数引用。
答案 1 :(得分:1)
术语$ test是指测试参数的值。使用$ test
例如:
<xsl:template match="title[contains(., $test)]">
<h2>
<xsl:value-of select="substring-before(., '/')"/>
</h2>
<p>
<xsl:value-of select="substring-after(., '/')"/>
</p>
</xsl:template>