2013-03-06 3 views
4

Мне нужно написать 2 запроса xpath, один из которых выбирает всех родителей определенного элемента из прямого родительского элемента в корневой каталог, а затем я смогу выбрать какой-либо конкретный атрибут элементов ,xpath для выбора всех родителей и всех детей

, а другой выбирает всех детей элемента независимо от того, где они находятся.

, например, если XML-документ является чем-то вроде:

<role key='total-admin'> 
    <role key='security-admin'> 
     <role key='users-admin'> 
      <role key='add-user'></role> 
      <role key='delete-user'></role> 
      <role key='deactivate-user'></role> 
     </role> 
    </role> 
</role> 
  1. Я хочу, чтобы выбрать все родители элемента с ключом «надстройкой пользователя» .the результат будет:

    [ 'users-admin' , 'security-admin' , 'total-admin' ] 
    
  2. Я хочу выбрать всех детей «security-admin». результат был бы:

    [ 'users-admin' , 'add-user' , 'delete-user' , 'deactivate-user' ] 
    

ответ

7

При первом использовании запроса:

//role[@key = 'add-user']/ancestor::* 

Для второго:

//role[@key = 'security-admin']//* 
3

У вас всегда есть узел контекста, который вы определяете как элемент со значением конкретного атрибута, например "add-user" или "security-admin":

//*[@key = "string"] 

Как это дает вам набор узлов выражение для узла контекста необходимо исключить все, не отдельные элементы такого рода:

//*[@key = "string" and count(//*[@key = "string"]) = 1] 

Это решает потребности в вашем контексте узел. Затем вы можете представить этот контекстный номер либо с ., либо записать его там дословно.

Выберите все родители, бабушки и дедушки, внуков бабушки и дедушки и так далее из контекста элемента (то есть ось предок):

./ancestor::* 
//*[@key = "string" and count(//*[@key = "string"]) = 1]/ancestor::* 

Выбрать всех детей (то есть ось потомок):

./descendant::* 
.//* 
//*[@key = "string" and count(//*[@key = "string"]) = 1]/descendant::* 
//*[@key = "string" and count(//*[@key = "string"]) = 1]//* 
Смежные вопросы