【问题标题】:Merge multiple xslt stylesheets合并多个 xslt 样式表
【发布时间】:2009-06-23 19:12:49
【问题描述】:

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

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

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

【问题讨论】:

    标签: xslt


    【解决方案1】:

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

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

    <?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 对其进行了测试,它似乎工作正常。

    【讨论】:

    • 如果包含的相对路径如下所示,这似乎不起作用: 对于这些场景还有什么办法吗?
    • 使用 MSXML,所描述的 XSLT 将空命名空间添加到我们主样式表中的 节点(其他不受影响),不知道为什么会发生这种情况。在应用转换后,我最终将 添加到主样式表中。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 这就是我害怕的:\
      【解决方案4】:

      你为什么想要?毕竟它们通常是分开的(通常是可维护性)

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

      【讨论】:

      • 用户解释说:“(文件)被传输到远程机器执行转换。由于它没有从磁盘加载,href链接被破坏”
      • 我编辑了问题以包含原因。因为这个答案是在编辑之前发布的。
      【解决方案5】:
       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/>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-24
        • 1970-01-01
        • 2012-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多