XPath:计算列表中每个级别的数字项

时间:2014-02-28 15:51:55

标签: xml xpath

我有一些XML列表,嵌套在多个级别(列表,子列表,子子列表等)。我需要一种方法来确定(使用XPath 1.0)列表中每个级别组合在一起的最大数量的元素。

例如,如果我有以下内容:

<list>
    <list-item><p>List item 1</p></list-item>
    <list-item><p>List item 2</p>
        <list>
            <list-item><p>Sub-list item 1</p></list-item>
            <list-item><p>Sub-list item 2</p></list-item>
        </list>
    </list-item>
    <list-item><p>List item 3</p>
        <list>
            <list-item><p>Sub-list item 1</p>
                <list>
                    <list-item><p>Sub-sub-list item 1</p></list-item>
                </list>
            </list-item>
            <list-item><p>Sub-list item 2</p>
                <list>
                    <list-item><p>Sub-sub-list item 1</p></list-item>
                    <list-item><p>Sub-sub-list item 2</p></list-item>
                </list>
            </list-item>
            <list-item><p>Sub-list item 3</p>
                <list>
                    <list-item><p>Sub-sub-list item 1</p></list-item>
                    <list-item><p>Sub-sub-list item 2</p></list-item>
                    <list-item><p>Sub-sub-list item 3</p></list-item>
                </list>
            </list-item>
        </list>
    </list-item>
    <list-item><p>List item 4</p></list-item>
</list>

在此我需要确定每个级别的最大数量的分组元素。所以在上面的例子中我会找到:

  • 1级(即列表项):4个元素
  • 第2级(即子列表项):2个元素
  • 第3级(即子子列表项):3个元素

我希望这是有道理的。

我正在使用可以使用XPath 1.0的排版包。不幸的是,它没有做到2.0。

谢谢!

1 个答案:

答案 0 :(得分:0)

我不认为您可以在XPath 1.0中执行此操作,如果每个级别发送一个查询也不行。

您必须找到给定级别的所有列表(这很简单://list[count(ancestor-or-self::list) = $level]),然后将其计数与该级别上彼此列表的计数进行比较。这需要将count(...)应用于每个列表,这在XPath 1.0中是不可能的。允许执行此操作的 XPath 2.0 查询类似于

//list[
  count(ancestor-or-self::list) = $level and
  not(count(list-item) < //list[count(ancestor-or-self::list) = $level]/count(list-item))
]

最后一个“轴步”./count(list-item))是你在XPath 1.0中无法做到的。

您可以获取给定级别的所有列表并搜索最大的XPath外部。

相关问题