предок или-я - PullRequest
       21

предок или-я

3 голосов
/ 12 мая 2009

У меня есть следующий xml:

<?xml version="1.0" encoding="utf-8" ?>
<ROLES>
<ROLE type="A">
    <USER name="w" />
    <USER name="x" />
    <ROLE type="B">
         <USER name="x" />
         <USER name="y" />
     </ROLE>
     <ROLE type="C">
         <USER name="x" />
         <USER name="y" />
          <USER name="z" />
     </ROLE>
</ROLE>
<ROLE type ="D">
 <USER name="w" />
</ROLE>
</ROLES>

и я хочу найти все узлы USER с name="x", которые являются непосредственными потомками узлов ROLE с атрибутом "type", равным "C", и их предков с name="x" (возможно, с использованием оси ancestor-or-self) , В этом случае набор узлов должен содержать два узла (не три, так как вхождение х под B должно не в счет).

Какое правильное выражение XPath могло бы это сделать? Почему не работает следующее выражение?

/ROLES//ROLE[@type='C']/USER[@name='x']/ancestor-or-self::USER[@name='x']

(возвращается только один узел, возможно, ось собственной личности, а не предки)

Любая помощь будет наиболее ценной.

1 Ответ

5 голосов
/ 12 мая 2009

Я хочу найти все узлы USER с именем = "x" ...

//USER[@name = 'x']

… которые являются непосредственными потомками узлов ROLE с атрибутом «тип», равным «С»…

//USER[@name = 'x' and parent::ROLE[@type = 'C']]

… и их предки с именем = "x".

?

Я не вижу никаких предков, которые могли бы иметь имя = "x". Что ты имеешь в виду?


РЕДАКТИРОВАТЬ: Ах, я думаю, я понимаю. Что вы имеете в виду:

... и дети их предков, которые USER s с именем = "x"

//USER[@name = 'x' and parent::ROLE[@type = 'C']]/ancestor::ROLE/USER[@name = 'x']

А теперь вопрос, почему ваш XPath не работает:

/ROLES//ROLE[@type='C']/USER[@name='x']/ancestor-or-self::USER[@name='x']
* 1 028 * выбирает * * тысячу двадцать-девять
  • все ROLE с, которые являются потомками /ROLES ("/ROLES//ROLE")…
  • … с @type='C' ("/ ROLES // ROLE [@ type = 'C']") ...
  • ... из их детей-ПОЛЬЗОВАТЕЛЕЙ те, у которых @name='x' (/USER[@name='x'])
  • … и оттуда все ancestor-or-self::USER с @name='x'

последний шаг локации нарушает его. Нет USER предков, только ROLE предков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...