1

文件1.xml

<config>
 <state version="10">
  <root value="100" group="5">
     <leaf number = "2"/>
  </root>
  <action value="2" step="4">
     <get score = "5"/>
  </action>
 </state>
</config>

文件2.xml

<config>
 <state version="10">
  <root value="100" group="5">
     <leaf number = "6"/>
  </root>
  <parent>
      <child node="yes"/>
  </parent>
 </state>
</config>

输出.xml

<config>
 <state version="10">
  <root value="100" group="5">
     <leaf number = "2"/>
     <leaf number = "6"/>
  </root>
  <action value="2" step="4">
     <get score = "5"/>
  </action>
  <parent>
      <child node="yes"/>
  </parent>
 </state>
</config>

这是对此处问题的后续问题:Merge 2 XML files based on attribute values using XSLT?

我在每个 XML 文件中有 2 个不同的标签(file1.xml 中的操作标签和 file2.xml 中的父标签),并且在遍历公共标签 () 后,我需要它们都出现在输出文件中。

请帮助我编写一个 XSLT 以确保这两个标签都反映在输出中。

4

1 回答 1

0

查看 JLRishie 的好答案,给出了以下复制匹配元素的模板:

<xsl:template match="root">
   <xsl:copy>
    <xsl:apply-templates select="@* | node()" />
    <xsl:copy-of
      select="document('file2.xml')
          /config/state[@version = current()/../@version]
                 /root[@value = current()/@value and
                       @group = current()/@group]/*" />

  </xsl:copy>
</xsl:template>

要扩展它以从 file2.xml 获取非元素,您可以添加一个新模板以匹配 file1.xml 中的状态元素,然后从 file2.xml 复制非根元素

<xsl:template match="state">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()" />
     <xsl:copy-of
      select="document('file2.xml')
            /config/state[@version = current()/@version]/*[not(self::root)]" />
  </xsl:copy>
</xsl:template>

这是完整的 XSLT

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

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

   <xsl:template match="state">
      <xsl:copy>
         <xsl:apply-templates select="@* | node()"/>
         <xsl:copy-of select="document('file2.xml')
              /config/state[@version = current()/@version]
                     /*[not(self::root)]"/>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="root">
      <xsl:copy>
         <xsl:apply-templates select="@* | node()"/>
         <xsl:copy-of select="document('file2.xml')
              /config/state[@version = current()/../@version]
                     /root[@value = current()/@value and
                           @group = current()/@group]/*"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

当应用于您的两个 XML 文件时,输出如下

<config>
   <state version="10">
      <root value="100" group="5">
         <leaf number="2"/>
         <leaf number="6"/>
      </root>
      <action value="2" step="4">
         <get score="5"/>
      </action>
      <parent>
         <child node="yes"/>
      </parent>
   </state>
</config>
于 2013-02-05T13:15:32.730 回答