XML项目的比较

时间:2013-03-20 06:18:56

标签: xml xslt xml-parsing

我是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以任何方式比较这两个项的值字段?

1 个答案:

答案 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>&#xA;</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)。