2008-09-16 56 views
7

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

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

是否有任何工具可以做到这一点?

回答

15

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

因此,您应该先使用xsl:include's替换xsl:import's,解决所有冲突并测试您是否仍然得到正确的结果。之后,您可以使用以下样式表将现有样式表合并为一个样式表。通过使用文件的功能,其内容href属性中引用的文件中包括与包括样式表的:只要将它应用到你的主样式表:

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

第一个模板替换所有XSL。第二个模板是identity transformation

我用Xalan测试过它,它似乎很好。

0

为什么你想要?它们通常是由于某种原因(通常是可维护性)而分开的(通常可维护性)

您可以随时编写合并 - 读取XSL文件,选择您感兴趣的模板项并写入新的主XSL文件。

+0

用户解释:“(该文件)传输到执行转换的远程机器。由于它不是从磁盘加载的href链接被破坏“ – 2008-09-16 09:17:05

+0

我编辑了这个伫列以包含原因,因为这个答案是在编辑之前发布的 – roo 2008-09-16 09:45:02

1

手动合并可能是最好的选择。

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

+0

这就是我害怕的:\ – roo 2008-09-16 08:20:18

2

不可能将导入的样式表纳入主文件而不会破坏import precedence。例如,您可以在导入的样式表中定义一个顶级变量,并在主文件中重新定义它。如果将两个文件合并成一个文件,您将得到两个具有相同名称和导入优先级的变量,这会导致错误。

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

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

-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/>