2

これが私の問題です。同じ構造の2つのxmlファイルがあり、2番目の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 を試してみましたが、うまくいきませんでした (パッチ プロセスはソース ドキュメントに変更を適用しませんでした)。また、扱う xml のサイズが大きいため、それが使用する DOM アプローチについても少し心配しています。これを行う良い方法を提案してください。私はC#2を使用しています

4

3 に答える 3

2

XSLT ではdocument()、File1 で空のノードに遭遇した場合、関数を使用して 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 version="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:コピー>
    </xsl:テンプレート>

    <xsl:template match="*[not(text())]">
      <xsl:コピー>
        <xsl:copy-of
          select="$vFile2/*/*[name() = name(current())]/text()"/>
        </xsl:コピー>
    </xsl:テンプレート>
</xsl:スタイルシート>

この XML ドキュメントに適用すると:

<ルート>
    <alpha>111</alpha>
    <beta>22</beta>
    <ガンマ></ガンマ>
    <デルタ></デルタ>
</ルート>

必要な結果が生成されます。

<ルート>
    <alpha>111</alpha>
    <beta>22</beta>
    <ガンマ></ガンマ>
    <delta>XX</delta>
</ルート>
于 2008-11-29T16:27:58.407 に答える
1

このマージは非常に具体的なようです。

その場合は、いくつかのコードを記述して、両方の xml ファイルをロードし、説明したように変更を適用してください。

于 2008-11-29T00:34:31.483 に答える