使用 xpath 的元素嵌套计数表达式
Expression for nesting count of elements using xpath
在 xml 模式中,- 的嵌套是允许无限制的,例如在无序列表中(
代表随机列表)。这些项目可能包含子项目,这些子项目可以使用 - 作为另一个列表元素中的子元素进行子列表,例如
或 用于有序列表。
现在我想检测文档中超过 3 个嵌套深度级别的嵌套,以对其应用一些约束。使用 xpath 这是应该允许无条件的:
随机列表//项目
或
随机列表//项目//项目
或
randlist//item//item//item
但是
应禁止项目嵌套深度超过 3 个的随机列表,例如
randlist//item//item//item//item
我如何使用 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"的函数。
根据你的问题,确切地知道你想要的输出是什么有点棘手,但我认为以下建议之一应该足够了,或者可以帮助你达到你的目标目标。
作为一般示例,您可以通过将一组 nodes/elements 传递给 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 元素的直接子元素的 item 元素的后代元素的数量。双斜杠 //
表示 XPath 搜索后代,而 *
运算符是一个通配符,它匹配任何元素,而不考虑元素名称。因此它将 return 4 - 因为有 4 个元素:content
、subitem
、p
和 p2
。
在您的情况下,我认为您希望检测位于 item
三层嵌套内的 randlist
和 seqlist
元素。如果你想检测这种情况,你可以使用:
count(randlist//item//item//item//randlist|randlist//item//item//item//seqlist)
|
运算符计算两个集合的并集。如果要检测位于 item
三层嵌套内的 any 元素的出现,您应该再次使用通配符运算符 *
:
count(randlist//item//item//item//*)
假设 randlist
始终是 XML 文档的根元素,这是一个可能的 XPath 表达式,用于检查它是否包含超过 3 层嵌套的 item
元素:
randlist[.//item[count(ancestor::item)>=3]]
你自己提供的表达有什么问题:
randlist//item//item//item//item
这将 select 任何具有三个或更多项目祖先的项目。
效率可能更高
randlist//item[count(ancestor::item) > 2]
但这取决于您使用的 XPath 处理器。
在 xml 模式中,
现在我想检测文档中超过 3 个嵌套深度级别的嵌套,以对其应用一些约束。使用 xpath 这是应该允许无条件的:
随机列表//项目
或
随机列表//项目//项目
或
randlist//item//item//item
但是
应禁止项目嵌套深度超过 3 个的随机列表,例如
randlist//item//item//item//item
我如何使用 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"的函数。
根据你的问题,确切地知道你想要的输出是什么有点棘手,但我认为以下建议之一应该足够了,或者可以帮助你达到你的目标目标。
作为一般示例,您可以通过将一组 nodes/elements 传递给 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 元素的直接子元素的 item 元素的后代元素的数量。双斜杠 //
表示 XPath 搜索后代,而 *
运算符是一个通配符,它匹配任何元素,而不考虑元素名称。因此它将 return 4 - 因为有 4 个元素:content
、subitem
、p
和 p2
。
在您的情况下,我认为您希望检测位于 item
三层嵌套内的 randlist
和 seqlist
元素。如果你想检测这种情况,你可以使用:
count(randlist//item//item//item//randlist|randlist//item//item//item//seqlist)
|
运算符计算两个集合的并集。如果要检测位于 item
三层嵌套内的 any 元素的出现,您应该再次使用通配符运算符 *
:
count(randlist//item//item//item//*)
假设 randlist
始终是 XML 文档的根元素,这是一个可能的 XPath 表达式,用于检查它是否包含超过 3 层嵌套的 item
元素:
randlist[.//item[count(ancestor::item)>=3]]
你自己提供的表达有什么问题:
randlist//item//item//item//item
这将 select 任何具有三个或更多项目祖先的项目。
效率可能更高
randlist//item[count(ancestor::item) > 2]
但这取决于您使用的 XPath 处理器。