我遇到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>
答案 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都不需要使用高阶函数。