有条件地从外部XML文件复制内容

时间:2013-07-05 20:51:05

标签: xslt

我有2个XML文件需要合并在一起(XML1和XML2)。我需要根据属性是负还是正,有条件地将XML2中的内容添加到XML1中。

实施例。 XML1

<containers>
    <basket1>
    </basket1>
    <basket2>
    </basket2>
</containers>

实施例。 XML 2

<fruit>
    <apple attr="1"/>
    <apple attr="-1"/>
</fruit>

实施例。输出

<containers>
    <basket1>
       <apple attr="1">
    </basket1>
    <basket2>
       <apple attr="-1"/>
    </basket2>
</containers>

如您所见,我不想修改XML1的结构accept,以根据“attr”的值添加内容。

我确信这方面有一个很好的解决方案,但我正在绘制如何将这些零碎的东西放在一起的空白。任何帮助表示赞赏! 干杯!

1 个答案:

答案 0 :(得分:3)

目前尚不清楚应该有多少通用 - 所以可能并不完全是你需要的。

<?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"/>

    <xsl:variable name="fruit" select="document('XML2.xml')/fruit" />

    <xsl:template match="/containers">
        <containers>
            <xsl:apply-templates select="node()[1]">
                <xsl:with-param name="type" select="'positive'" />
            </xsl:apply-templates>
            <xsl:apply-templates select="node()[2]">
                <xsl:with-param name="type" select="'negative'" />
            </xsl:apply-templates>      </containers>
    </xsl:template>

    <xsl:template match="node()">
        <xsl:param name="type" />
        <xsl:copy>
            <xsl:choose>
                <xsl:when test="$type = 'positive'">
                    <xsl:copy-of select="$fruit/*[@attr &gt;= 0]" />
                </xsl:when>
                <xsl:when test="$type = 'negative'">
                    <xsl:copy-of select="$fruit/*[@attr &lt; 0]" />
                </xsl:when>
            </xsl:choose>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

我希望XML1是输入文件,XML2我加载到变量中。 应该做一些改进,比如检查属性是否真的是一个数字等。