递归合并多个XSLT样式表

时间:2011-05-03 14:53:58

标签: xslt

我希望将多个xslt样式表(V1.0)合并到一个样式表中。

我已经看过这里发布的类似问题了。

Merge multiple xslt stylesheets

帖子上提供的答案确实有效,但只链接了一个级别的导入样式表。

以下是为此提供的答案。

    <?xml version="1.0" ?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                    version="1.0">

    <xsl:template match="xsl:include">
      <xsl:copy-of select="document(@href)/xsl:stylesheet/*"/>
    </xsl:template>

    <xsl:template match="@*|node()">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
    </xsl:template>

我在导入的样式表上有xsl:import引用一级,所以需要重新编译导入的样式表,否则我只是获得下一级的xsl:import链接,这会破坏单个XSLT的对象。

首先创建单个XSLT不是一个选项,因为它们需要分开才能更轻松地管理内容版本控制。

有人可以如何实现这一目标吗?

1 个答案:

答案 0 :(得分:2)

你不能简单地替换

<xsl:template match="xsl:include">
  <xsl:copy-of select="document(@href)/xsl:stylesheet/*"/>
</xsl:template>

<xsl:template match="xsl:include">
  <xsl:apply-templates select="document(@href)/xsl:stylesheet/*"/>
</xsl:template>

但是,您说要删除xsl:import声明以及xsl:include。这样做会改变代码的语义。

(事实上,合并xsl:includes也会产生一些小的副作用。这意味着包含模块中的模板受xsl:stylesheet元素中的exclude-result-prefixs等属性的影响主模块,并丢失所包含模块中存在的任何此类属性。)