Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过';级别';_Php_Xpath_Relative Path - Fatal编程技术网

Php 通过';级别';

Php 通过';级别';,php,xpath,relative-path,Php,Xpath,Relative Path,我试图找出一个XPath查询字符串来执行以下操作 给定如下XML文档: <root> <data>foo1</data> <irrelevant-node> <data>foo1</data> </irrelevant-node> <irrelevant-node /> <data>foo2</data> <

我试图找出一个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>

foo1
foo1
食物2
bar1
bar2
你好
你好
世界1
三维直方图
foo1
我想获取未包含在
中的所有
节点

然后,我想获取所有最上面的
节点,并在它们上重复前面的过程,相对地工作

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

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

基本上,我会 执行多个进程(PHP) 根据节点的 内容,然后替换它们。 但是,节点起到排序的作用 范围分隔符的,一旦我完成 处理给定数据库中的所有
节点 范围,我向下移动一个区域级别。
节点可以嵌套在 其他无关节点

使用

//data[count(ancestor::region) = $n]
其中,
$n
为0,1,…,最大深度

对于$n的每一个值,表达式将选择“级别$n”的所有
数据
元素

您可以找到“最大深度”作为所选每个节点的
计数(祖先::区域)+1的最大值:

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

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

在第二次迭代中还应使用“bar…”
数据来选择/root/region/unrelated节点/数据。
?@Alejandro:这是正确的。第一次迭代应该捕获所有
foo
数据。第二个,
。第三,你好,等等。问得好,+1。请参阅我的答案以了解解释和解决方案。:)谢谢迪米特里·诺瓦切夫;我要试一试:)嗯,它好像不起作用;声明它是无效的表达式。我测试了
//zuq:data[count(祖先::zuq:region=0)]
(我没有提到目标节点在
zuq
命名空间中),结果出错。抱歉,不管怎样,这是你和我的输入错误的集合:)太棒了!再次感谢你,迪米特@汤姆卡泰克索多斯:对不起,我不得不修正我答案中的两个拼写错误。现在它是正确的。