2

这是我的问题。我有 2 个结构相同的 xmlfiles,与第一个相比,第二个 xml 只包含几个节点。

文件 1

  <root>
    <alpha>111</alpha>
    <beta>22</beta>
    <gamma></gamma>
    <delta></delta>
  </root>

文件2

 <root>
    <beta>XX</beta>
    <delta>XX</delta>
 </root>

结果应该是这样的

 <root>
    <alpha>111</alpha>
    <beta>22</beta>
    <gamma></gamma>
    <delta>XX</delta>
 </root>

基本上,如果 File1 中任何节点的节点内容为空,则它应该从 File2 读取值(如果存在,即)。

我确实尝试了使用 Microsoft XmlDiff API 的运气,但它对我没有用(补丁过程没有将更改应用于源文档)。我也有点担心它使用的 DOM 方法,因为我要处理的 xml 的大小。你能建议一个这样做的好方法吗?我正在使用 C# 2

4

3 回答 3

2

在 XSLT 中,如果在 File1 中遇到空节点,您可以使用该document()函数从 File2 中检索节点。就像是:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:template match="root/*[.='']">
    <xsl:variable name="file2node">
        <xsl:copy-of select="document('File2.xml')/root/*[name()=name(current())]"/>
    </xsl:variable>
    <xsl:choose>
      <xsl:when test="$file2node != ''">
        <xsl:copy-of select="$file2node"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:copy/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template match="*">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
于 2008-11-29T01:07:21.540 回答
2

这是 Alastair 提出的更简单、更有效的解决方案(请参阅我对他的解决方案的评论)。

这种转变:

<xsl:stylesheet 版本="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
  <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:变量名="vFile2"
         select="document('File2.xml')"/>

    <xsl:template match="*">
      <xsl:复制>
        <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:模板>

    <xsl:template match="*[not(text())]">
      <xsl:复制>
        <xsl:副本
          select="$vFile2/*/*[name() = name(current())]/text()"/>
        </xsl:copy>
    </xsl:模板>
</xsl:样式表>

应用于此 XML 文档时:

<根>
    <alpha>111</alpha>
    <beta>22</beta>
    <伽玛></伽玛>
    <delta></delta>
</root>

产生想要的结果:

<根>
    <alpha>111</alpha>
    <beta>22</beta>
    <伽玛></伽玛>
    <delta>XX</delta>
</root>
于 2008-11-29T16:27:58.407 回答
1

这种合并似乎非常具体。

如果是这种情况,只需编写一些代码来加载两个 xml 文件并按照您的描述应用更改。

于 2008-11-29T00:34:31.483 回答