我有我的xsl来转换xml_file_1。我必须xml_file_2包含在 xsl 的输出中。
例如,输出文件的结构为:
<A>
<B>
<!-- inject external xml here -->
<C/>
</B>
</A>
怎么做?
我尝试使用以下收据:
<xsl:template match="/">
<xsl:copy-of select="document('external.xml')/*"/>
</xsl:template>
但它只是用外部文件的内容替换输出文件。我尝试了上述模板的不同变体,例如将 match="/" 指向我需要插入的节点(match="/A/B"),但没有结果。
附言在 xsl 中使用之前,我将使用 sed 从外部文件中删除第一行<?xml version="1.0" encoding="utf-8"?>
。
我认为注入点应该用一些元素来标记,例如:
<?xml version="1.0" encoding="UTF-8"?>
<A>
<B>
<InjectionPoint />
<C/>
</B>
</A>
让外部.xml成为
<?xml version="1.0" encoding="UTF-8"?>
<ExternaFile>
<Content1 />
<Content2 />
</ExternaFile>
然后可以使用稍微修改的身份转换
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<!-- Identity transform-->
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<!-- Replacing inject point element-->
<xsl:template match="InjectionPoint">
<xsl:copy-of select="document('external.xml')" />
</xsl:template>
</xsl:stylesheet>
结果是
<?xml version="1.0" encoding="UTF-8"?>
<A>
<B>
<ExternaFile>
<Content1/>
<Content2/>
</ExternaFile>
<C/>
</B>
</A>
顺便说一句,你不需要通过 sed 剥离 xml 序言。
编辑:我不想使用特殊元素来标记正确的位置,您可以使用模板,例如
<!--or without "inject" element -->
<xsl:template match="B[parent::A]">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:copy-of select="document('external.xml')" />
<xsl:apply-templates select="node()" />
</xsl:copy>
</xsl:template>
但是可能会出现几个问题(例如,当 A 元素中有更多的 B 元素时,当有多个包含 B 元素的 A 元素时等)。