Запрос XPath на множестве узлов работает как SQL, где в - PullRequest
1 голос
/ 20 июня 2010

образец XML-документа:

  <xml>
    <list>
      <item refid="1" />
      <item refid="3" />
    </list>
    <catalogue>
      <model id="1"><details /></model>
      <model id="2"><details /></model>
      <model id="3"><details /></model>
    </catalogue>
  </xml>

Я бы хотел запросить что-то вроде // model [@id = (// item / @ refid)] получить всю "модель", имеющую ссылочный идентификатор в "списке"

Ответы [ 2 ]

2 голосов
/ 20 июня 2010

Я бы хотел запросить что-то вроде // модель [@id = (// item / @ refid)] для получить все "модели", имеющие ссылки идентификатор в "списке"

Основная проблема здесь заключается в том, что вы не уверены , а на самом деле не используете движок XPath для оценки выражений, которые вы придумали.

Если вы оцениваете предложенное вами выражение XPath:

//model[ @id = (//item/@refid) ]

Вы увидите, что он выбирает ровно (два) элемента model, на атрибуты которых id ссылаются атрибуты refid элементов item, которые являются потомками list.

@ Йорн-Хорстманн в своем ответе уже объяснил, почему вы получаете эти результаты.

Небольшое замечание: обычно избегайте использования // сокращения . Это вызывает сканирование всего документа и является очень неэффективным. В этом случае я бы использовал эквивалентный, но, вероятно, более быстрый способ оценки выражения XPath:

/*/catalogue/model[@id = /*/list/item/@refid]
2 голосов
/ 20 июня 2010

Ваше выражение xpath уже должно возвращать именно то, что вы хотите. Цитата из http://www.w3.org/TR/xpath/#booleans, 5-й абзац:

Если один объект для сравнения является набором узлов, а другой является строкой, то сравнение будет истинным, если и только если в наборе узлов есть узел, так что результат выполнения сравнения на строковое значение узла, а другая строка - true

...