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

17

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

我原本期望有类似这样的语法:

<xsl:import ... >
  <xsl:with-param ... 
</xsl:import>

但是这是不被允许的。

同时,在样式表参数中,tunnel="yes"是被禁止的。


有时候,您可以利用这样一个事实:如果导入工作表中的模板使用参数,则可以从导入样式表中使用参数调用它。 - Jon Hanna
4个回答

24

尝试这个:

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,这会有效地设置参数的值。


提供信息,根据我的实证测试,在导入样式表中,您可以使用xsl:variable或xsl:param来覆盖参数。 - Archie

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(覆盖来自导入表的默认值)。


3

也许这也有帮助:

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

使用<xsl:apply-imports>传递参数是XSLT 2.0的一个特性--在XSLT 1.0中不可能实现。


2

补充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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接