Это выражение XPath :
count(
ExprForYourNode//*
[not(count(ancestor::* )
>
count(ExprForYourNode/ancestor::*) + 2
)
]
)
выбрать все потомки-или-себя элементов от элемента, выбранного выражением ExprForYourNode
с максимальной глубиной2 (на основе нуля)
Если вы хотите выбрать все нисходящие или собственные узлы (элементы, текстовые узлы, узлы комментариев и узлы инструкций обработки) используйте :
count(
ExprForYourNode//node()
[not(count(ancestor::* )
>
count(ExprForYourNode/ancestor::*) + 2
)
]
)
Например, с этим документом :
<t>
<a>
<b>
<c>
<d/>
</c>
</b>
</a>
</t>
это выражение :
count(
/*/a//*
[not(count(ancestor::* )
>
count(/*/a/ancestor::*) + 2
)
]
)
производит :
2
Это количество элементов (b
и c
, но не d
), которые являются потомками a
с относительной глубиной кa
2 или менее.
Аналогично, оценка этого выражения :
count(
/*/a//node()
[not(count(ancestor::* )
>
count(/*/a/ancestor::*) + 2
)
]
)
производит :
6
Это количество элементов (как и прежде) плюс количество текстовых узлов (только для пробелов) на глубине до 2 относительно элемента a