使用 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 个元素:contentsubitempp2

在您的情况下,我认为您希望检测位于 item 三层嵌套内的 randlistseqlist 元素。如果你想检测这种情况,你可以使用:

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 处理器。