2015-04-23 4 views
0

я пытаюсь выбрать все ключи, которые имеют следующий родственный узел Dict и чья одна из его дочерних узлов является верно, например, в приведенном ниже XML :Выберите элементы, если конкретная родственное присутствуют с определенным дочерним узлом

<dict> 
    <key>A</key> 
    <dict> 
     <key>Disabled</key> 
     <true/> 
    </dict> 
    <key>B</key> 
    <dict> 
     <key>Disabled</key> 
     <false/> 
    </dict> 
    <key>C</key> 
    <dict> 
     <key>Disabled</key> 
     <true/> 
    </dict> 
    <key>D</key> 
    <id>1</id> 
</dict> 

я должен получить а и С. Я пробовал:

//key[../dict/true] 
//key[../dict/[following-sibling::dict/true]] 

и многие другие. Любая помощь будет высоко ценится.

ответ

1

Вы можете попробовать это:

//key[following-sibling::dict[position()=1]/true] 

Это выбирает следующие dict элементы, которые имеют position() из 1 (то есть сразу после key, а также потомок true

following-sibling::node() выбирает ALL. следующие браки и сестры, но following-sibling::node()[position()=1] выбирает только FIRST.

+0

На самом деле, ваше выражение пути также будет выбирать элементы 'key', которые ** не ** имеют непосредственный следующий брат, названный' dict', потому что 'next-sibling :: dict [position() = 1]' означает «первый элемент' dict' после текущего контекстного узла », а не первый следующий брат в целом. –

+0

nah, xpath не возвращает мне никакого результата. – orange

+0

@orange, не уверен в вашей среде, но с вашим примером xml мой xpath возвращает ожидаемые результаты. –

2

Выражение пути вам нужно, это

/dict/key[following-sibling::*[position() = 1 and name() = 'dict' and true]] 

, который переводит

/dict/key    Select an outermost element, and its children `key` 
[following-sibling::* but only if there is a following sibling 
[position() = 1   that is the first following sibling 
and name() = 'dict'  and that is also a `dict` element 
and true]]    that has at least one child element named `true`. 

Принимая в качестве входного документа вы показываете, результаты (отдельные результаты, разделенные ----------):

<key>A</key> 
----------------------- 
<key>C</key> 

В качестве альтернативы:

/dict/key[following-sibling::*[position() = 1 and self::dict and true]]