Выражение для подсчета вложенности элементов с помощью xpath



В xml-схеме вложенность s допускается неограниченной, например, в неупорядоченном списке элементов (который является для случайного списка). Эти элементы могут содержать подэлементы, которые могут быть сублистированы с использованием в качестве подэлемента в другом элементе списка, таком как или для упорядоченных списков.



Теперь я хочу обнаружить вложенность более 3 уровней глубины вложенности в документе, чтобы применить к нему некоторые ограничения. Использование xpath это то, что должно быть разрешено необусловленный:



Randlist / / item



Или



Randlist / / item / / item



Или



Randlist / / item / / item/ / item



Но



Рандлисты с более чем 3 уровнями глубины вложенности элементов должны быть запрещены, например



Randlist//элемента//элемента//элемента//элемента



Как я могу использовать xpath для формулировки выражения, которое выражает вложенность элементов за пределами третьего уровня?



Заранее благодарю



Извините, люди! так вот пример идет



<randlist> <!-- first level (not nested at all): allowed -->
<item>
This is the first item of an unordered enumeration of items that are prosa altogether.
</item>
<item>
<randlist> <!-- second level (nested): allowed -->
<item>
This is the first item of an unordered enumeration of items that are prosa altogether.
</item>
<item>
Another item with some information in the nested unordered list.
</item>
<item>
<seqlist> <!-- third level (double nested): allowed -->
<item>
This is the first item of an ordered enumeration of items (it may be shown with the number 1).
</item>
<item>
This is the second item of an ordered enumeration of items (it may be shown with the number 2).
<randlist> <!-- fourth level (triple nested): should be prohibited -->
<item>
This is the first item of an unordered enumeration of items.
</item>
<item>
This is the second item of an unordered enumeration of items.
</item>
</randlist>
</item>
<item>
This is the third item of an ordered enumeration of items (it may be shown with the number 3).
</item>
</seqlist>
</item>
</randlist>
</item>
</randlist>


Мне нужно обнаружить более 3 уровней списков элементов, то есть четвертый уровень и более. Мне нужно что-то вроде, например, randlist[count(nesting(item))>3], Если бы в xpath была функция типа "nesting".

700   3  

3 ответов:

Что не так с выражением, которое вы сами себе предоставили:

randlist//item//item//item//item

Будет выбран любой элемент,имеющий три или более предков элемента.

Более эффективным может быть

randlist//item[count(ancestor::item) > 2]

Но это зависит от используемого процессора XPath.

Из вашего вопроса немного сложно узнать точно, каков ваш желаемый результат, но я думаю, что одного из следующих предложений должно быть достаточно, или помочь вам достичь своей цели.

В качестве общего примера можно подсчитать количество элементов, прошедших определенный уровень вложенности, передав набор узлов / элементов в функцию count XPath. Например:

XML

<randlist>
    <item>
        <content>Example Content</content>
        <subitem>
          <p>Content</p>
          <p2>More Content</p2>
        </subitem>
    </item>
</randlist>

XPath

count(randlist/item//*)

Это будет считаться количество элементов, которые являются потомками элементов, которые являются прямыми дочерними элементами randlist. Двойная косая черта // означает, что XPath ищет потомков, а оператор * является подстановочным знаком, который соответствует любым элементам, независимо от имени элемента. Поэтому он вернется 4 - потому что есть 4 элемента: content, subitem, p и p2.

В вашем случае, я думаю, вы ищете, чтобы обнаружить randlist и seqlist элементы, которые расположены в пределах трех уровней вложенность item. Если вы хотите обнаружить это событие, вы можете использовать:

count(randlist//item//item//item//randlist|randlist//item//item//item//seqlist)
Оператор

Вычисляет объединение двух множеств. Если вы хотите обнаружить появление любого элемента, расположенного в пределах трех уровней вложенности item, снова следует использовать подстановочный оператор *:

count(randlist//item//item//item//*)

Предполагая, что randlist всегда является корневым элементом XML-документа, это одно из возможных выражений XPath для проверки, содержит ли он более 3 вложенных элементов уровня item:

randlist[.//item[count(ancestor::item)>=3]]

Comments

    Ничего не найдено.