我的xsl文件有一个参数
<xsl:param name="halfPath" select="'halfPath'"/>
我想在match内部使用它
<xsl:template match="Element[@at1='value1' and not(@at2='{$halfPath}/another/half/of/the/path')]"/>
但这并不起作用。我猜想我不能在''内使用参数。如何修复/解决这个问题?
我的xsl文件有一个参数
<xsl:param name="halfPath" select="'halfPath'"/>
我想在match内部使用它
<xsl:template match="Element[@at1='value1' and not(@at2='{$halfPath}/another/half/of/the/path')]"/>
XSLT 1.0 W3C规范禁止在匹配模式中引用变量/参数,请参考此处:
"match属性的值包含VariableReference是错误的"
XSLT 2.0没有这种限制,因此使用XSLT 2.0。
如果无法使用XSLT2.0,则将指令的完整内容放在中,其中测试与匹配模式结合使用等效于包含变量/参数引用的XSLT 2.0匹配模式。
在更复杂的情况下,如果有多个模板匹配相同类型的节点,但具有引用变量/参数的不同谓词,则需要使用包装的而不是包装的。
那么,您可以在模板中使用条件指令:
<xsl:template match="Element[@at1='value1']">
<xsl:if test="not(@at2=concat($halfPath,'/another/half/of/the/path'))">
.. do something
</xsl:if>
</xsl:template>
您只需要知道这个模板会处理所有满足第一个条件的元素。如果您有另一个模板可以处理与第一个条件匹配但不符合第二个条件的元素,则使用 <xsl:choose>
,并将另一个模板的内容放在 <xsl:otherwise>
块中。
或者,如果您可以切换到 XSLT2 处理器,则 XSLT2 可以直接处理它。
这个话题回答了我的问题,但是Flynn1179提出的解决方案对我来说不太正确(因人而异)。所以尝试按照比我更专业的人建议的方式进行操作,但如果它对你没有用,请考虑我是如何解决它的。我正在使用只处理XSL版本1.0的xsltproc。
我需要匹配<leadTime小时="0024">
,但要使用参数:<xsl:param name="hour">0024</xsl:param>
。我发现:
<xsl:if test="@hour='{$hour}'">
没有起作用,尽管这里和其他地方的声明是XSL v.1.0所需的语法。
相反,更简单的<xsl:if test="@hour=$hour">
就可以胜任工作。
还有一点:Dimitre在上面建议将模板放在if语句中。xsltproc对此抱怨:相反,我将if语句放在模板内部:
<xsl:template match="leadTime">
<xsl:if test="@hour=$leadhour">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:if>
</xsl:template>
<xsl:template match="Element[@at1='value1' and
not(@at2=$halfPath/another/half/of/the/path)]"/>
而不是
<xsl:template match="Element[@at1='value1' and
not(@at2='{$halfPath}/another/half/of/the/path')]"/>