用于查找重复节点的XPath的XmlPad问题

时间:2011-01-27 15:14:31

标签: duplicates xpath

[编辑]似乎我正在使用的XML编辑器(XmlPad)中存在一个错误,它阻止Xpath查询返回正确的结果。我使用两个在线工具(http://www.zrinity.com/xml/xpath/xpath.cfm和http://www.futurelab.ch/xmlkurs/xpath.en.html)测试了相同的查询,它似乎有效。 biziclop还评论说该查询在Oxygen中正常工作。

我有这个结构:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <itemlist>
    <item>
      <code>0001.0.00</code>
      <category>709</category>
    </item>
    <item>
      <code>0001.0.00</code>
      <category>709</category>
    </item>
    <item>
      <code>0002.0.00</code>
      <category>708</category>
    </item>
  </itemlist>
  <itemlist>
    <item>
      <code>0016.0.00</code>
      <category>52</category>
    </item>
    <item>
      <code>0016.0.00</code>
      <category>52</category>
    </item>
    <item>
      <code>0016.0.00</code>
      <category>51</category>
    </item>
    <item>
      <code>0016.0.00</code>
      <category>50</category>
    </item>
    <item>
      <code>0869.0.00</code>
      <category>52</category>
    </item>
    <item>
      <code>0869.0.00</code>
      <category>51</category>
    </item>
    <item>
      <code>0869.0.00</code>
      <category>50</category>
    </item>
  </itemlist>
</root>

我想找到上一个项目具有相同类别的所有项目。

此Xpath查询:

//item[category = preceding-sibling::item[1]/category]

返回以下节点:

<item>
  <code>0001.0.00</code>
  <category>709</category>
</item>
<item>
  <code>0016.0.00</code>
  <category>52</category>
</item>
<item>
  <code>0869.0.00</code>
  <category>52</category>
</item>

结果集中的最后一个项目节点不正确,因为输入中上一项目类别的值不是52,因此不应返回该值。

是否有一个Xpath查询会返回我想要的结果?

1 个答案:

答案 0 :(得分:0)

这个XPath绝对正确。我用 Saxon XSLT处理器测试了它,如下所示:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
            <xsl:copy-of select="//item[category 
            = preceding-sibling::item[1]/category]"/>   
    </xsl:template>

</xsl:stylesheet>

结果:

<item>
   <code>0001.0.00</code>
   <category>709</category>
</item>
<item>
   <code>0016.0.00</code>
   <category>52</category>
</item>

您可能还想尝试替代方案:

//item[category = ./preceding-sibling::item[1]/category]
/root/itemlist/item[category = ./preceding-sibling::item[1]/category]