我是XML新手,所以我不知道如何做到这一点:
假设我有以下XML文件1:
<Items>
<Item>
<name> Item1 </name>
<value> 10 </value>
</Item>
</Items>
和文件2:
<Items>
<Item>
<name> Item1 </name>
<value> 20 </value>
</Item>
</Items>
如何使用XSLT以任何方式比较这两个项的值字段?
答案 0 :(得分:1)
您可以将类似以下的样式表应用于第一个XML,并将第二个XML文档的路径作为param
传递(请阅读XSLT处理器的文档,了解如何传递参数)。
模板将检查XML#1中的每个<Item>
,找到其他XML(<name>
)中具有相同$otherDoc//Item[name = $ownName][1]/value
的第一个项目,并比较各自的<value>
第
然后它将生成文本输出,每行进行一次这样的比较。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:param name="otherDocPath" select="''" />
<xsl:variable name="otherDoc" select="document($otherDocPath)" />
<xsl:template match="/">
<!-- handle each item in this document -->
<xsl:apply-templates select="/Items/Item" />
</xsl:template>
<xsl:template match="Item">
<xsl:variable name="ownName" select="name" />
<xsl:variable name="ownValue" select="value" />
<xsl:variable name="otherValue" select="$otherDoc//Item[name = $ownName][1]/value" />
<!-- output one line of information per item -->
<xsl:value-of select="concat($ownName, ': ')" />
<xsl:choose>
<xsl:when test="$ownValue = $otherValue">
<xsl:value-of select="concat('same value (', $ownValue, ')')" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat('different (', $ownValue, '/', $otherValue, ')')" />
</xsl:otherwise>
</xsl:choose>
<xsl:text>
</xsl:text><!-- new line -->
</xsl:template>
</xsl:stylesheet>
小心名称/值周围的空格。如果您的输入看起来像<value> 10 </value>
,则在比较/输出任何内容(normalize-space()
等)之前,您希望使用<xsl:variable name="ownValue" select="normalize-space(value)" />
。
输出如下:
Item1: different (10/20) Item2: same value (20) Item3: different (20/)
其中第1行和第2行代表两个XML文档中的项目,第3行代表仅在第一个中的项目。
当然,文本输出只有一种可能性,您可以输出不同的格式(XML,HTML)。