Это правильно: ребенок / ребенок / *?
Нет,
child
выбирает все дочерние элементы текущего узла, имя которого child
.
child/child
выбирает все элементы с именем child
, которые являются дочерними элементами любого элемента с именем child
, который является дочерним элементом текущего узла. Итак, вышеприведенное выражение выбирает всех внуков текущего узла, которые имеют имя child
и чьи родители также называются child
. Это наиболее близко к "внукам элемента".
Выражение XPath, о котором вы спрашиваете:
child/child/*
выбирает все элементы (независимо от имени), которые являются дочерними элементами элементов с именем child
, которые являются дочерними элементами элементов с именем child
, которые являются дочерними элементами текущего узла. Это некоторые из внуков текущего узла (дети внуков).
Чтобы полностью ответить на вопрос, следующее выражение выбирает всех внуков текущего узла :
*/node()
Это все узлы, которые являются потомками всех элементов, которые являются потомками текущего узла.
Обратите внимание на следующее :
Только элементы и узел документа могут иметь дочерние элементы.
Любой узел (за исключением узла документа), не только узел элемента, может быть и обычно является дочерним по отношению к какому-либо другому узлу. Следовательно, могут быть внуки, которые не являются элементами, такие как текстовые узлы, узлы комментариев и узлы инструкций по обработке. Атрибуты и узлы пространства имен технически не являются дочерними.