合并多个xslt样式表

时间:2008-09-16 07:43:50

标签: xslt

我有一个带有多个xsl:import的xslt样式表,我想将它们全部合并到一个xslt文件中。

这是我们正在使用的系统的限制,它作为存储在内存中的字符串对象传递到xsl样式表。这将传输到执行转换的远程计算机。由于它没有从磁盘加载,因此href链接被破坏,因此我们需要从样式表中删除xsl:import

有没有可以做到这一点的工具?

5 个答案:

答案 0 :(得分:16)

您可以使用XSL样式表来合并样式表。但是,这相当于使用xsl:include元素,而不是xsl:import(正如Azat Razetdinov已经指出的那样)。您可以阅读差异here

因此,您应该首先用xsl:include替换xsl:import's,解决所有冲突并测试您是否仍然得到正确的结果。之后,您可以使用以下样式表将现有样式表合并为一个样式表。只需将其应用于主样式表:

<?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:stylesheet>

第一个模板使用document函数替换所有xsl:include和包含的样式表,该函数读入href属性中引用的文件。第二个模板是identity transformation

我用Xalan进行了测试,看起来效果很好。

答案 1 :(得分:2)

在不破坏import precedence的情况下,无法将导入的样式表包含到主文件中。例如,您在导入的样式表中定义顶级变量,并在主文件中重新定义它。如果将两个文件合并为一个,则会得到两个具有相同名称和导入优先级的变量,这将导致错误。

解决方法是两个用xsl:include替换xsl:import's并解析任何conflicts。之后,您可以安全地将xsl:include指令替换为相应文件的内容,因为这是XSLT-processor does

  

包含在XML树级别工作。由href属性值定位的资源被解析为XML文档,并且此文档中xsl:stylesheet元素的子元素替换了包含文档中的xsl:include元素。包含模板规则或定义的事实不会影响它们的处理方式。

答案 2 :(得分:1)

手动合并可能是最佳选择。

主要考虑因素可能是确保匹配模板的逻辑在组合样式表中起作用。

答案 3 :(得分:0)

你为什么要这样?它们通常是因为某种原因而分离的(通常是可维护性的)

您总是可以自己编写合并 - 读取XSL文件,选择您感兴趣的模板项并写入新的主XSL文件...

答案 4 :(得分:-1)

 import multiple xsl in single xsl

      <xsl:import href="FpML_FXOption_Trade_Template1.xsl"/>
      <xsl:apply-imports/>

<calypso:keyword>
                <calypso:name>DisplayOptionStyle</calypso:name>
<calypso:value>Vanilla</calypso:value>
</calypso:keyword>

           <xsl:import href="FpML_FXOption_Trade_Template2.xsl"/>
           <xsl:apply-imports/>