0

xsl を使用して、重複する名前 (値が異なっていても) を持つエントリを削除しながら、2 つの xml ファイルを連結したいと考えています。サンプルファイルを参照してください。どうもありがとうございました。

ファイル 1.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<archive>
  <entry>
    <name>xxx</name>
    <value>123</value>
  </entry>
  <entry>
    <name>yyy</name>
    <value>456</value>
  </entry>
  <entry>
    <name>zzz</name>
    <value>789</value>
  </entry>
</archive>

ファイル 2.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<archive>
  <entry>
    <name>xxx</name>
    <value>2468</value>
  </entry>
  <entry>
    <name>ttt</name>
    <value>13579</value>
  </entry>
</archive>

結果のファイルは次のようになります。

<?xml version="1.0" encoding="ISO-8859-1"?>
<archive>
  <entry>
    <name>xxx</name>
    <value>123</value>
  </entry>
  <entry>
    <name>yyy</name>
    <value>456</value>
  </entry>
  <entry>
    <name>zzz</name>
    <value>789</value>
  </entry>
  <entry>
    <name>ttt</name>
    <value>13579</value>
  </entry>
</archive>
4

1 に答える 1

3

この変換:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pDoc1" select="document('file:///c:/temp/delete/file1.xml')"/>
 <xsl:param name="pDoc2" select="document('file:///c:/temp/delete/file2.xml')"/>

 <xsl:template match="/">
  <xsl:apply-templates select="$pDoc1/*"/>
 </xsl:template>

 <xsl:template match="/*">
  <archive>
   <xsl:copy-of select="node()"/>
   <xsl:copy-of select="$pDoc2/*/entry[not(name = current()/*/name)]"/>
  </archive>
 </xsl:template>
</xsl:stylesheet>

任意の XML ドキュメント (使用されていない) に適用され、このコンテンツを含むファイルがある場合 (提供されているとおり):

c:\temp\delete\file1.xml

<archive>
  <entry>
    <name>xxx</name>
    <value>123</value>
  </entry>
  <entry>
    <name>yyy</name>
    <value>456</value>
  </entry>
  <entry>
    <name>zzz</name>
    <value>789</value>
  </entry>
</archive>

c:\temp\delete\file2.xml

<archive>
  <entry>
    <name>xxx</name>
    <value>2468</value>
  </entry>
  <entry>
    <name>ttt</name>
    <value>13579</value>
  </entry>
</archive>

必要な正しい結果が生成されます

<archive>
   <entry>
      <name>xxx</name>
      <value>123</value>
   </entry>
   <entry>
      <name>yyy</name>
      <value>456</value>
   </entry>
   <entry>
      <name>zzz</name>
      <value>789</value>
   </entry>
   <entry>
      <name>ttt</name>
      <value>13579</value>
   </entry>
</archive>
于 2012-10-19T20:16:39.243 に答える