Помощь с запросом XPath (количество) - PullRequest
2 голосов
/ 02 сентября 2011

Я хочу сосчитать все узлы-потомки определенного узла, но только всех потомков, которые ниже определенного уровня, начиная с 0. У вас есть какие-либо предложения?

В принципе это кажется чем-тонапример:

count(//fstructure/node()) + count(//fstructure/node()/node()) + count(//fstructure/node()/node()/node()) + 1

работает для 3-х уровней и узла (элемента) "fstructure", даже если это не очень хорошо, но мне просто нужно было это для отладки.

с наилучшими пожеланиями,
Йоханнес

1 Ответ

2 голосов
/ 03 сентября 2011

Это выражение 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

...