我试图比较两个响应,并从中找出相同和不同的ID。之后,我需要将它们合并为一个单独的XML文档。
这里有一个XML文档,保存在一个名为$one:的变量中
<test>
<console>
<consoles>
<ID>123</ID>
</consoles>
<consoles>
<ID>122</ID>
</consoles>
<consoles>
<ID>134</ID>
</consoles>
</console>
</test>
这是另一个XML文档,保存在一个名为$two:的变量中
<test>
<console>
<consoles>
<ID>123</ID>
</consoles>
<consoles>
<ID>122</ID>
</consoles>
<consoles>
<ID>134</ID>
</consoles>
<consoles>
<ID>456</ID>
</consoles>
</console>
</test>
我需要做的是,我需要比较这两个XML文档,并获得ID的值,这些ID在两个XML文件以及不同的文件中都是相同的。所以输出看起来像这样:
<test>
<console>
<consoles>
<ID>123</ID>
</consoles>
<consoles>
<ID>122</ID>
</consoles>
<consoles>
<ID>134</ID>
</consoles>
<consoles>
<ID>456</ID>
</consoles>
</console>
</test>
任何帮助都将不胜感激。提前谢谢。
这里有一个简单的纯XSLT1.0解决方案:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="xsl">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vRtfDoc2">
<test>
<console>
<consoles>
<ID>123</ID>
</consoles>
<consoles>
<ID>122</ID>
</consoles>
<consoles>
<ID>134</ID>vDoc2
</consoles>
<consoles>
<ID>456</ID>
</consoles>
</console>
</test>
</xsl:variable>
<xsl:variable name="vDoc2" select="document('')/*/xsl:variable[@name = 'vRtfDoc2']/*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<test>
<console>
<xsl:apply-templates select="/*/*/*"/>
<xsl:apply-templates select="$vDoc2/*/*[not(ID = current()/*/*/*/ID)]"/>
</console>
</test>
</xsl:template>
</xsl:stylesheet>
当此转换应用于提供的两个XML文档中的第一个时:
<test>
<console>
<consoles>
<ID>123</ID>
</consoles>
<consoles>
<ID>122</ID>
</consoles>
<consoles>
<ID>134</ID>
</consoles>
</console>
</test>
生成所需的正确结果:
<test>
<console>
<consoles>
<ID>123</ID>
</consoles>
<consoles>
<ID>122</ID>
</consoles>
<consoles>
<ID>134</ID>
</consoles>
<consoles xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<ID>456</ID>
</consoles>
</console>
</test>
注意:
如果第二个文档在其自己的XML文件中,并且没有嵌入到转换中(这里只是为了方便起见(,则结果中的xsl
命名空间将不会出现。