【问题标题】:Conditionally copy content from external XML file有条件地从外部 XML 文件复制内容
【发布时间】:2013-07-05 20:51:04
【问题描述】:

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

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

【问题讨论】:

  • 您熟悉 Xpath 吗?您使用什么语言(c/c++/c#/java 等)?编辑:刚刚看到标签,所以你想单独使用 xslt 吗?
  • @Ron.B.I 我想使用 XSLT,但这只是在 Java 应用程序中执行的一系列转换中的一个步骤。如果 Java 可以增强功能,那没关系。编辑说我使用 Saxon 9 作为解析器。我对 XSLT 1.0 或 2.0 无所谓。无论哪种效果最好。
  • 如果你想用 Java 做,我可以帮助你,但是我不熟悉 Saxon 9 解析器,你熟悉 Xpath/Xquery 吗?
  • @Ron.B.I 感谢任何帮助,但如果我长期倾向于 XSLT 解决方案,请不要生气。我对 XPath 非常熟悉。

标签: xslt


【解决方案1】:

尚不清楚它应该具有多少通用性 - 所以它可能不是您所需要的。

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

【讨论】:

  • 我已经为我工作了。谢谢!我怎样才能确保篮子 1 和篮子 2 上的任何属性也被复制? 正在为我抛出错误。
  • Nvm 关于属性位。我已经让它工作了。已接受答案!
猜你喜欢
  • 2015-01-14
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多