XSLT:一种合并 xml 文件的简单方法

Posted

技术标签:

【中文标题】XSLT:一种合并 xml 文件的简单方法【英文标题】:XSLT: A simple way to merge xml files 【发布时间】:2010-12-03 09:35:17 【问题描述】:

我有两个 xml 文件。我需要将它们合并在一起,其中元素“myid”在两者之间匹配。请查看这些示例文件...

文件1.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
  <data>
    <title>Title1</title>
    <description>Description1</description>
    <myid>1</myid>
  </data>

  <data>
    <title>Title2</title>
    <description>Description2</description>
    <myid>2</myid>
  </data>
</catalog>

文件2.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
  <data>
    <author>Author1</author>
    <date>12/34/5678</date>
    <myid>1</myid>
  </data>

  <data>
    <author>Author2</author>
    <date>87/65/4321</date>
    <myid>2</myid>
  </data>
</catalog>

生成的文件如下所示:

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
  <data>
    <title>Title1</title>
    <description>Description1</description>
    <myid>1</myid>
    <author>Author1</author>
    <date>12/34/5678</date>
  </data>

  <data>
    <title>Title2</title>
    <description>Description2</description>
    <myid>2</myid>
    <author>Author2</author>
    <date>87/65/4321</date>
  </data>
</catalog>

【问题讨论】:

我希望this 对我有帮助似乎很简单 相关:***.com/questions/1430710/two-xml-in-one-xslt @dacracot:输入文件的格式也不正确。 -------- @nicholas.alipaz:我们看到的是摘录,而不是整个文件? 我更新了我的帖子。很抱歉造成混乱。 【参考方案1】:

我一直在研究,在这里发现了一个非常相似的问题: http://forums.tizag.com/showthread.php?p=76699

这是我想出的,这似乎大部分都在工作,除了 Firefox 没有将其识别为 xml 文件,即使我添加了 xml:output。

File1.xml(注意第二行,引用我们的转换):

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="merge.xsl"?>
<catalog>
  <data>
    <title>Title1</title>
    <description>Description1</description>
    <myid>1</myid>
  </data>

  <data>
    <title>Title2</title>
    <description>Description2</description>
    <myid>2</myid>
  </data>
</catalog>

文件2.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
  <data>
    <author>Author1</author>
    <date>12/34/5678</date>
    <myid>1</myid>
  </data>

  <data>
    <author>Author2</author>
    <date>87/65/4321</date>
    <myid>2</myid>
  </data>
</catalog>

合并.xsl:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes" />
  <xsl:variable name="with" select="'File2.xml'" />

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="scene">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
      <xsl:variable name="info" select="document($with)/catalog/data[myid=current()/myid]/." />
      <xsl:for-each select="$info/*">
        <xsl:if test="name()!='myid'">
          <xsl:copy-of select="." />
        </xsl:if>
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>
</xsl:transform>

查看File1.xml时输出xml:

<catalog>
  <data>
    <title>Title1</title>
    <description>Description1</description>
    <myid>1</myid>
    <author>Author1</author>
    <date>12/34/5678</date>
  </data>

  <data>
    <title>Title2</title>
    <description>Description2</description>
    <myid>2</myid>
    <author>Author2</author>
    <date>87/65/4321</date>
  </data>
</catalog>

【讨论】:

404;帖子不存在了 @AdamLynch 抱歉,我查找了帖子的缓存版本,但结果为空。这并不是很重要,因为我概述了上面需要的所有内容。最好的!

以上是关于XSLT:一种合并 xml 文件的简单方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 SAXON 和 XSLT 合并 XML 文件

XSLT 分组/合并子项(使用密钥)

使用 XSLT 将具有相同 ID 的元素 (XML) 合并到 txt 文件

使用 XSLT 重命名节点

将简单 XML 输出为 HTML 表的 XSLT?

如何合并具有“相同父亲”、相同方法和相同 id=0 的两个节点(使用 XSLT)?