合并多个XSLT样式表

9
我有一个具有多个 xsl:import 的 XSLT 样式表,我想将它们全部合并到一个 XSLT 文件中。这是我们使用的系统的限制,它将 XSL 样式表作为存储在内存中的字符串对象传递。它传输到远程机器执行转换。由于它没有从磁盘加载,所以 href 链接是不完整的,因此我们需要从样式表中移除 xsl:import。是否有任何工具可以做到这一点?
5个回答

16

您可以使用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属性所引用的文件中包含的样式表。第二个模板是标识转换

我已经在Xalan上测试过,看起来很好用。


1
如果包含相对路径,似乎无法正常工作:<xsl:include href="..\utils\date.xsl" /> <xsl:include href="..\utils\utils.xsl" />这种情况有什么解决方法吗? - Shiv
使用MSXML,所描述的XSLT会向我们的主样式表中的<xsl:calltemplate ..>节点添加空名称空间(其他节点未受影响),不确定为什么会发生这种情况。最终我在应用转换后将<xsl:calltemplate ..>添加到主样式表中。 - Florian Haupt

2

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

解决方法是用xsl:include替换xsl:import,并解决任何冲突。之后,您可以安全地将xsl:include指令替换为相应文件的内容,因为这就是XSLT-处理器的工作方式

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


1

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

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


这就是我担心的事情:\ - roo

0

你为什么想要这样做呢?毕竟它们通常是有原因分开的(通常是为了可维护性)

你可以自己编写合并代码 - 读取 XSL 文件,选择你感兴趣的模板项,并将其写入新的主 XSL 文件...


用户解释道:“(该文件)被传输到远程机器上进行转换。由于它没有从磁盘加载,因此href链接已经损坏。” - Steve Cooper
我编辑了问题并加入了原因。因为这个答案是在那个修改之前发布的。 - roo

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接