Выражение для подсчета вложенности элементов с помощью 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".
3 ответов:
Что не так с выражением, которое вы сами себе предоставили:
randlist//item//item//item//itemБудет выбран любой элемент,имеющий три или более предков элемента.
Более эффективным может быть
randlist//item[count(ancestor::item) > 2]Но это зависит от используемого процессора XPath.
Из вашего вопроса немного сложно узнать точно, каков ваш желаемый результат, но я думаю, что одного из следующих предложений должно быть достаточно, или помочь вам достичь своей цели.
В качестве общего примера можно подсчитать количество элементов, прошедших определенный уровень вложенности, передав набор узлов / элементов в функцию
countXPath. Например: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