Учитывая структуру, как показано ниже, в которой элемент RootFolder
может содержать любое количество элементов Folder
, включая вложенные элементы Folder
, я хочу выбрать все элементы RootFolder
, которые содержат хотя бы одного потомка * Элемент 1005 *, для которого все его предшественники Folder
(если есть) имеют атрибут visible
, установленный в значение true.
<Root>
<!-- This should be included -->
<RootFolder>
<Folder visible="true">
<File />
</Folder>
<Folder visible="false">
<File />
</Folder>
</RootFolder>
<!-- This should be included -->
<RootFolder>
<Folder visible="true">
<Folder visible="true">
<File />
</Folder>
</Folder>
</RootFolder>
<!-- This should not be included -->
<RootFolder>
<Folder visible="false">
<File />
</Folder>
</RootFolder>
<!-- This should not be included -->
<RootFolder>
<Folder visible="false">
<Folder visible="true">
<File />
</Folder>
</Folder>
</RootFolder>
<!-- This should not be included -->
<RootFolder>
<Folder visible="true">
<Folder visible="false">
<File />
</Folder>
</Folder>
</RootFolder>
</Root>
Следующее выражение XPath не работает, потому что оно включает в себя два последних элемента RootFolder
.
//RootFolder[descendant::File[ancestor::Folder[@visible='true']]]
Учитывая следующую цитату из раздела «Семантика предиката» в http://courses.ischool.berkeley.edu/i290-14/s05/lecture-7/allslides.html,, действительно ожидается, что приведенное выше выражение XPath работает так же, как и раньше. Так что, возможно, то, что я пытаюсь сделать, невозможно, но я просто хотел убедиться, что я что-то не упустил.
Предикаты приводят к значению выражения, которое преобразуется в
boolean ... Набор узлов имеет значение true, если он не пустой.
Возможно ли то, что я пытаюсь достичь, используя предикат XPath или какое-либо эквивалентное выражение XPath? Является ли единственной альтернативой программно подтвердить, что все предки удовлетворяют условию?