Все ответы, кроме @Alejandro, имеют одинаковую общую ошибку :
Это не правда, что :
preceding-sibling::*
выбирает все узлы предшествующего брата.
Он выбирает только все элементы предшествующего брата.
Чтобы выбрать все узлы предшествующего брата, используйте :
preceding-sibling::node()
В XPath есть такие узлы :
Корневой узел (обозначается /
), также обозначается как document-node()
в XPath 2.0
Узлы элементов . такие как <a/>
Текстовые узлы . В <a> Hello </a>
текстовый узел является единственным потомком a
и имеет строковое значение «Hello»
Узлы комментариев . <!-- This is a comment-->
Обработка инструкций узлов . <?someName I am a PI ?>
Узлы атрибутов . В <a x="1"/>
x
это единственный атрибут a
.
Узлы пространства имен . <a xmlns:my="my:namespace"/>
a
имеет узел пространства имен со значением "my: namespace" и именем (префикс) my
Узлы первых 5 видов можно выбрать с помощью оси preceding-sibling::
:
preceding-sibling::node()
выбирает все родственные узлы от 1 до 5.
preceding-sibling::*
выбирает все элементы, предшествующие родным братьям
preceding-sibling::someName
выбирает все элементы с именем "someName", предшествующие родным братьям
preceding-sibling::text()
выделяет все текстовые узлы, предшествующие братьям и сестрам (полезно в смешанном контенте)
preceding-sibling::comment()
выбирает все узлы комментариев, предшествующие родным братьям.
preceding-sibling::processing-instruction()
выбирает всех предшествующих братьев и сестер, которые являются PI
preceding-sibling::processing-instruction('someName')
выбирает всех предшествующих братьев и сестер, которые являются PI и называются "someName".