是否可以为导入样式表的参数赋值?
我原本期望有类似这样的语法:
<xsl:import ... >
<xsl:with-param ...
</xsl:import>
但是这是不被允许的。
同时,在样式表参数中,tunnel="yes"是被禁止的。
是否可以为导入样式表的参数赋值?
我原本期望有类似这样的语法:
<xsl:import ... >
<xsl:with-param ...
</xsl:import>
但是这是不被允许的。
同时,在样式表参数中,tunnel="yes"是被禁止的。
尝试这个:
main.xsl
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="import.xsl"/>
<xsl:variable name="param" select="'some-value'"/>
<xsl:template match="/">
<xsl:call-template name="foo"/>
</xsl:template>
</xsl:stylesheet>
import.xsl
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="param" select="'default'"/>
<xsl:template name="foo">
<out><xsl:value-of select="$param"/></out>
</xsl:template>
</xsl:stylesheet>
在导入的样式表中,xsl:variable可以覆盖导入样式表中的xsl:param,这会有效地设置参数的值。
快速浏览规格表,可以看出不允许这样的构造:
简而言之,href
是唯一允许的属性,元素体内不允许有内容。
然而,如果我理解您的用例,那么您应该以正常方式设置参数(使用您的宿主语言)。它真的不应该关心它是在导入的样式表中定义的。例如,假设您有这个样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="import.xsl"/>
<xsl:template match="/">
<xsl:value-of select="$test"/>
</xsl:template>
</xsl:stylesheet>
这个导入了以下内容:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="test" select="'default'"/>
</xsl:stylesheet>
如果想要设置test
参数,则可以按照正常方式进行设置。请注意,如果您想提供新的默认值,还可以从导入的表中“屏蔽”该参数。
因此,将以下内容添加到第一个样式表中:
<xsl:param name="test" select="'default2'"/>
...这将导致它打印default2
(覆盖来自导入表的默认值)。
也许这也有帮助:
XSLT 2.0中,可以向导入的样式表中重写的模板传递参数,并使用<xsl:apply-imports>
从覆盖的模板实例化。
使用<xsl:apply-imports>
传递参数是XSLT 2.0的一个特性--在XSLT 1.0中不可能实现。
补充lwburk的优秀答案(+1),这里再举一个将值分配给导入样式表参数的例子。
在主样式表中不需要添加xsl:param
,只需在调用样式表时(例如在命令行上)分配值即可。
main.xsl
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="import.xsl"/>
<xsl:template match="/">
<xsl:call-template name="foo"/>
</xsl:template>
</xsl:stylesheet>
import.xsl
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="param" select="'default'"/>
<xsl:template name="foo">
<out><xsl:value-of select="$param"/></out>
</xsl:template>
</xsl:stylesheet>
示例Saxon命令行(设置新参数值)
java -cp "saxon9.jar" net.sf.saxon.Transform -s:input.xml -xsl:main.xsl -o:output.xml param="kuba"
output.xml
<out>kuba</out>