Вопрос

Образец 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 / @ Refis)] Чтобы получить всю «модель», имеющую ссылку на ссылку в «Список»

Это было полезно?

Решение

Я хотел бы запросить что-то вроде // model [@ID = (// item / @ Refis)] Чтобы получить всю «модель», имеющую ссылку на ссылку в «Список»

Главная проблема здесь - ваше отсутствие доверия И на самом деле не работает двигатель XPath для оценки выражений, с которыми вы придумали.

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

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

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

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

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

/*/catalogue/model[@id = /*/list/item/@refid]

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top