1

我有 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”值的内容。

我确信有一个很好的解决方案,但我正在绘制关于如何将零碎组合在一起的空白。任何帮助表示赞赏!干杯!

4

1 回答 1

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 加载到一个变量中。应该做一些改进,比如检查属性是否真的是一个数字等。

于 2013-07-05T21:10:36.627 回答