简体   繁体   English

使用XSLT合并基于属性值的2个XML文件?

[英]Merge 2 XML files based on attribute values using XSLT?

file1.xml file1.xml

<config>
 <state version="10">
  <root value="100" group="5">
     <leaf number = "2"/>
  </root>
  <root value="101" group="6">
     <leaf number = "3"/>
  </root>
 </state>
</config>

file2.xml file2.xml

<config>
 <state version="10">
  <root value="100" group="5">
     <leaf number = "6"/>
  </root>
  <root value="101" group="6">
     <leaf number = "4"/>
  </root>
 </state>
</config>

output.xml output.xml

<config>
 <state version="10">
  <root value="100" group="5">
     <leaf number = "2"/>
     <leaf number = "6"/>
  </root>
  <root value="101" group="6">
     <leaf number = "3"/>
     <leaf number = "4"/>
  </root>
 </state>
</config>

I tried writing an XSLT based on the answer here: How to merge 2 XML files with common nodes using XSLT? 我尝试根据以下答案编写XSLT: 如何使用XSLT将2个XML文件与公共节点合并?

but I do not know how to compare based on attribute values (in this case, attributes value and group of 'root' tag? Can someone please help? 但是我不知道如何根据属性值进行比较(在这种情况下,属性值和“ root”标签的组不同?有人可以帮忙吗?

This should do it: 应该这样做:

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

</xsl:stylesheet>

When run with your file1.xml example as the main input, this produces: 当以file1.xml示例作为主要输入运行时,将产生:

<config>
  <state version="10">
    <root value="100" group="5">
      <leaf number="2" />
      <leaf number="6" />
    </root>
    <root value="101" group="6">
      <leaf number="3" />
      <leaf number="4" />
    </root>
  </state>
</config>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM