0

我有我的 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") 但没有结果。

<?xml version="1.0" encoding="utf-8"?>PS在 xsl 中使用它之前,我将使用 sed 从外部文件中删除第一行。

4

1 回答 1

0

我认为注入点应该用一些元素来标记,比如:

<?xml version="1.0" encoding="UTF-8"?>
<A>
    <B>
        <InjectionPoint />
        <C/>
    </B>
</A>

让 external.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 元素时,当有多个 A 元素包含 B 元素时等)。

于 2013-09-23T12:19:18.843 回答