Проблемы с XmlPad с XPath для поиска дублирующих узлов - PullRequest
3 голосов
/ 27 января 2011

[EDIT] Похоже, что в редакторе 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 голосов
/ 19 июня 2011

Этот 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...