合并多个xslt样式表
我有一个xslt样式表,其中包含多个xsl:import
s,我想将它们全部合并到一个xslt文件中。
这是我们使用的系统的局限性,因为它围绕xsl样式表作为存储在内存中的字符串对象传递。这将传输到远程计算机,在此执行转换。由于没有从磁盘加载href链接,因此我们需要从样式表中删除xsl:import。
有没有可以做到这一点的工具?
解决方案
回答
你为什么要通常出于某种原因(通常是可维护性)将它们分开
我们总是可以自己编写合并,以读取XSL文件,选择我们感兴趣的模板项,然后写入新的主XSL文件...
回答
手动合并可能是最好的选择。
主要考虑因素可能是确保匹配模板的逻辑在组合样式表中有效。
回答
在不破坏导入优先级的情况下,不可能将导入的样式表包含到主文件中。例如,我们在导入的样式表中定义一个顶级变量,然后在主文件中重新定义它。如果将两个文件合并为一个,则将获得两个具有相同名称的变量并导入优先级,这将导致错误。
解决方法是用xsl:includes替换xsl:imports并解决所有冲突。之后,我们可以安全地将xsl:include指令替换为相应的文件内容,因为这就是XSLT处理器的作用:
The inclusion works at the XML tree level. The resource located by the href attribute value is parsed as an XML document, and the children of the xsl:stylesheet element in this document replace the xsl:include element in the including document. The fact that template rules or definitions are included does not affect the way they are processed.
回答
我们可以使用XSL样式表来合并样式表。但是,这等效于使用xsl:include元素,而不是使用xsl:import(正如Azat Razetdinov指出的那样)。我们可以在此处阅读其中的区别。
因此,我们应该首先将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测试了它,它似乎工作正常。
回答
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/>