导入的样式表中的XSLT样式表参数

时间:2012-01-19 18:58:25

标签: xslt parameters import

是否可以为导入的样式表的参数赋值?

我期待像

这样的东西
<xsl:import ... >
  <xsl:with-param ... 
</xsl:import>

但不允许这样做。

样式表参数中也禁止使用tunnel =“yes”。

4 个答案:

答案 0 :(得分:18)

试试这个:

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:变量可以覆盖导入样式表中的xsl:param,这有效地设置了参数的值。

答案 1 :(得分:4)

快速浏览一下规格表明不允许这样的结构:

简而言之,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(覆盖导入的工作表中的默认值)。

答案 2 :(得分:2)

也许这也有帮助:

在XSLT 2.0中,可以将参数传递给导入的样式表中的覆盖模板,并使用 <xsl:apply-imports> 从覆盖模板中实例化它。

使用<xsl:apply-imports>传递参数只是XSLT 2.0的一项功能 - 这在XSLT 1.0中是不可能的。

答案 3 :(得分:1)

只是为了添加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>