代码之家  ›  专栏  ›  技术社区  ›  roo

合并多个XSLT样式表

  •  7
  • roo  · 技术社区  · 16 年前

    我有一个带有多个 xsl:import S和我想将它们合并到一个XSLT文件中。

    这是我们使用的系统的一个限制,在这里它作为存储在内存中的字符串对象传递XSL样式表。这会传输到远程机器,在那里执行转换。因为它没有从磁盘加载,所以我们需要删除 XSL:导入 来自样式表。

    有什么工具可以做到这一点吗?

    5 回复  |  直到 15 年前
        1
  •  16
  •   Community CDub    7 年前

    可以使用XSL样式表合并样式表。但是,这相当于使用xsl:include元素,而不是xsl:import(正如azat-razettinov已经指出的那样)。你可以读懂区别 here .

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

    <?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测试过了,它看起来工作得很好。

        2
  •  2
  •   Azat Razetdinov    16 年前

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

    解决方法是用xsl:include替换xsl:imports并解决 conflicts . 之后,您可以安全地将xsl:include指令替换为相应的文件内容,因为这就是 XSLT-processor does :

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

        3
  •  1
  •   Robert Christie    16 年前

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

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

        4
  •  0
  •   chrisb    16 年前

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

    您可以自己编写合并-在中读取XSL文件,选择您感兴趣的模板项,然后写入新的主XSL文件…

        5
  •  -1
  •   Dinesh Lingot    15 年前
     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/>