比较两个 xml 并获取公共节点
Compare two xmls and get the common nodes
我有两个 xml。需要阅读这两个并创建新的 xml 只有共同的元素
第一个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>
第二个XML
<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>
输出应该是
<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>
如何使用 xslt 1.0 执行此操作。输出应该具有来自 xml 的共同元素。
使用此 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>
我有两个 xml。需要阅读这两个并创建新的 xml 只有共同的元素
第一个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>
第二个XML
<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>
输出应该是
<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>
如何使用 xslt 1.0 执行此操作。输出应该具有来自 xml 的共同元素。
使用此 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>