apply-templates不使用包含的文件

时间:2015-12-08 22:51:54

标签: xml templates xslt

我遇到xsl:include和xsl:apply-templates的问题。我正在使用xsl:call-template中的动态QName进行一些实验,我找到了一种方法,但是......它只适用于#34; inline"而不是包含文件。

如果我这样做,它运作良好(一个文件 - file.xsl) - 它显示文本" test"来自匹配模板:

<xsl:variable name="template" select="document('')/*/xsl:template"/>

<xsl:template match="xsl:template[@name='test']" name="test">
    test
</xsl:template>

<xsl:template match="root">
    <xsl:apply-templates select="$template[@name = $show]"/>
</xsl:template>

($ show =&#39; test&#39;)

但是,如果我把第一部分放到不同的文件中,例如template.xsl然后我将用xsl:include调用它,它不起作用。我不知道为什么。

<xsl:variable name="template" select="document('')/*/xsl:template"/>

<xsl:include href="template.xsl" />

<xsl:template match="root">
    <xsl:apply-templates select="$template[@name = $show]"/>
</xsl:template>

有人可以帮助我吗? xsl:include应该将filename.xsl的内容放到父模板中,但它看起来并没有

注意:我有XSLT 1.0

编辑2015-12-10: 谢谢你们指出一个问题。我现在正在动态设置文档(&#39;&#39;)的路径,它就像一个魅力!问题显然在那个空白文件上(&#39;&#39;),非常感谢Michael和其他人。

<xsl:variable name="path"><xsl:value-of select="$show"/>.xsl</xsl:variable>
<xsl:variable name="templatePath" select="document($path)/*/xsl:template"/>
...
...
<xsl:template match="root">
    <xsl:apply-templates select="$template[@name = $show]"/>
</xsl:template>

1 个答案:

答案 0 :(得分:0)

它不起作用的原因是表达式

document('')/*/xsl:template

仅在包含文档中选择xsl:template元素。

您使用的设计模式实质上是对Dimitre Novatchev的FXSL的第一个(XSLT 1.0)版本的重新设计。我建议你仔细阅读。 IIRC,Dimitre的方法与xsl:template元素不匹配,而是与名称对应于您要执行的模板名称的元素相匹配:

<xsl:variable name="names-fragment">
  <A/>
  <B/>
</xsl:variable> 

<xsl:variable name="names" select="exslt:node-set($names-fragment)"/>

<xsl:template name="A" match="A">
    <xsl:call-template name="B"/>
</xsl:template>

<xsl:template name="B" match="B">
    <xsl:param name="target"/>
    <xsl:apply-templates select="$names/*[name()=$target]"/>
</xsl:template>

此处变量$names可在所有样式表模块中访问。

当然,在XSLT 3.0中,所有这些tomfoolery都不需要使用高阶函数。