Запрос XPath на узле, работающий как SQL, где в
Вопрос
Образец 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-й абзац:
Если сравнивать один объект, это узел, а другой - это строка, то сравнение будет верным, если и только в том случае, если есть узел в узле, установленном таким образом, что результат выполнения сравнения на значении строки узла и другая строка верна