比较两个xmls并获取公共节点

时间:2015-05-23 22:06:26

标签: xml xslt xpath xslt-1.0

我有两个xml。需要阅读这两个并创建仅包含公共元素的新xml

第一个XML:

body {
    background-color: darkgrey;
}

.social a,
.social a:hover,
.social a:focus {
    color: #fefefe; // white
}

第二个XML

<Items>
    <array>
        <item name="A">
            <name>A</name>
            <indate>20141112</indate>
            <inno>2</inno>
            <status>1</status>
            <level>12</level>
            <size>.1</size>
            <text>item a text </text>
        </item>
        <item name="B">
            <name>B</name>
            <indate>20141012</indate>
            <inno>5</inno>
            <status>1</status>
            <level>13</level>
            <size>.5</size>
            <text>item b text </text>
        </item>
        <item name="C">
            <name>C</name>
            <indate>20140912</indate>
            <inno>6</inno>
            <status>1</status>
            <level>12</level>
            <size>.2</size>
            <text>item c text </text>
        </item>
       </array>
</Items>

输出应为

<Items>
    <array>
     <item name="A">
            <name>A</name>
            <ondate>20140612</ondate>
            <onno>9</onno>
            <status>1</status>
            <level>12</level>
        </item>
        <item name="B">
            <name>B</name>
            <ondate>20140212</ondate>
            <inno>7</inno>
            <status>1</status>
            <level>13</level>
            <size>.5</size>
        </item>
        <item name="D">
            <name>D</name>
            <indate>20140712</indate>
            <inno>9</inno>
            <status>1</status>
            <level>12</level>
        </item>
       </array>
</Items>

如何使用xslt 1.0执行此操作。输出应该具有来自xml的共同元素。

1 个答案:

答案 0 :(得分:1)

使用此XSLT:

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

  <xsl:variable name="xml2" select="document('xml2.xml')//item" />

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

  <xsl:template match="item">
    <xsl:variable name="item" select="$xml2[@name = current()/@name]"/>
    <xsl:if test="$item">
      <xsl:copy>
        <xsl:apply-templates select="@*"/>

        <xsl:for-each select="*">
          <xsl:if test="$xml2/*[name() = name(current()) and . = current()/.]">
            <xsl:apply-templates select="."/>
          </xsl:if>
        </xsl:for-each>
      </xsl:copy>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

当应用于第一个XML时,xml2.xml是第二个XML(来自您的问题)产生:

<Items>
  <array>
    <item name="A">
      <name>A</name>
      <status>1</status>
      <level>12</level>
    </item>
    <item name="B">
      <name>B</name>
      <status>1</status>
      <level>13</level>
      <size>.5</size>
    </item>
  </array>
</Items>