使用XSLT动态包含XML文件

时间:2013-05-21 13:37:10

标签: xml xslt dynamic include

我正在尝试以下列方式将多个XML文件合并为一个:

假设我有一个名为fruit.xml的XML文件:

<fruit>
    <apples>
        <include ref="apples.xml" />
    </apples>
    <bananas>
        <include ref="bananas.xml" />
    </bananas>
    <oranges>
        <include ref="oranges.xml" />
    </oranges>
</fruit>

以及从fruit.xml引用的后续XML文件,例如apples.xml

<fruit>
    <apples>
        <apple type="jonagold" color="red" />
        <... />
    </apples>
</fruit>

等等...我想将这些合并到1个XML文件中,如下所示:

<fruit>
    <apples>
        <apple type="jonagold" color="red" />
        <... />
    </apples>
    <bananas>
        <banana type="chiquita" color="yellow" />
        <... />
    </bananas>
    <oranges>
        <orange type="some-orange-type" color="orange" />
        <... />
    </oranges>
</fruit>

我想根据apples.xml元素中bananas.xml属性的值动态确定“子”文件(如ref<include>等) fruits.xml然后将它们包含在输出中。

这可以使用XSLT吗?

1 个答案:

答案 0 :(得分:1)

如果只包含文件内容,您可以使用:

<xsl:copy-of select="document(@ref)/fruit/*/*"/>

因此请尝试:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

    <xsl:output indent="yes" method="xml" encoding="utf-8" omit-xml-declaration="yes" />

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="include">
        <xsl:copy-of select="document(@ref)/fruit/*/*"/>
    </xsl:template>
</xsl:stylesheet>