递归合并多个XSLT样式表

问题描述:

我期待将多个xslt样式表(V1.0)合并到一个样式表中。递归合并多个XSLT样式表

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

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:进口参考下一层的进口样式因此需要过于重新诅咒进口样式表,否则,我只是得到了xsl:为下一级的进口环节这击败了单个XSLT的对象。

刚开始创建单个XSLT不是一种选择,因为它们需要分开来管理内容版本控制。

有没有人可以做到这一点?

你不能简单地用

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

但是更换

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

,你说你要折叠的xsl:import声明以及XSL:包括。这样做会改变你的代码的语义。 (事实上​​,在xsl:includes中的合并也可能有一些小的副作用,这意味着包含模块中的模板会受xsl:stylesheet中排除结果前缀等属性的影响主要模块的元素,并且失去所包含模块中存在的任何此类属性。)

+0

+1好答案。 – 2011-05-03 17:32:24

+0

谢谢,这工作。忽略xsl:import语句。我打算说xsl:include。 – Doomster 2011-05-04 07:01:57