按“级别”迭代的相对XPath查询

时间:2011-01-07 20:05:43

标签: php xpath relative-path

我正在尝试找出一个XPath查询字符串来执行以下操作。

给出这样的XML文档:

<root>
    <data>foo1</data>
    <irrelevant-node>
        <data>foo1</data>
    </irrelevant-node>
    <irrelevant-node />
    <data>foo2</data>
    <irrelevant-node />
    <region>
        <data>bar1</data>
        <data>bar2</data>
        <irrelevant-node />
        <region>
            <data>hello1</data>
            <irrelevant-node />
            <data>hello2</data>
            <region>
                <irrelevant-node />
                <data>world1</data>
            </region>
        </region>
        <irrelevant-node />
        <data>bar3</data>
        <irrelevant-node>
            <data>foo1</data>
        </irrelevant-node>
        <irrelevant-node />
    </region>
    <irrelevant-node />
</root>

我想抓住<data>中未包含的所有<region>个节点。

然后我想抓住所有最顶层的<region>节点并重复上一个过程,相对工作。

基本上,我将基于其内容在<data>节点上执行多个进程(PHP),然后替换它们。但是,<region>节点充当一种范围分隔符,一旦我完成处理给定范围内的所有<data>个节点,我就会向下移动一个区域级别。 <data>个节点可以嵌套在其他不相关的节点中。

不确定XPath是否是最好的工具,而且我在解决这个问题时遇到了很多麻烦。如上所述,我正在使用DOM类的PHP实现。

1 个答案:

答案 0 :(得分:3)

  

基本上,我会成为   执行许多进程(PHP)   在基于他们的节点上   内容,然后替换它们。   但是,节点充当排序   范围分隔符,一旦我完成   处理给定的所有<data>个节点   范围,我向下移动一个区域级别。   <data>个节点可以嵌套在其中   其他不相关的节点。

使用

//data[count(ancestor::region) = $n]

其中$n为0,1,...,max-depth。

对于$ n的每个值,表达式选择“level $ n”中的所有data元素。

您可以找到“max-depth”作为所选节点的count(ancestor::region)+1的最大值:

//region[not(descendant::region)]

可以在单个XPath 2.0表达式中指定此最大 ,但不能在单个XPath 1.0表达式中指定。