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
计算所有属性的Xpath?_Xpath_Attributes - Fatal编程技术网

计算所有属性的Xpath?

计算所有属性的Xpath?,xpath,attributes,Xpath,Attributes,我可能在尝试做一些无效的事情,但可能有比我更聪明的人知道正确的语法来解决我的问题。 给定: 1000 500 如果我使用/*[@code=“vehicle”]/*[@code=“car”]//*[@code=“price”],我将返回两个框(1000.00和500.00)——如预期,但不是我想要的 是否有一种xpath语法可以针对所有具有@code属性的节点进行计算,而不是跳过它,如果它与最终结果不匹配,即我只返回第一个框(价格为1000.00)?像询问一样,选择第一个节点为@code且@co

我可能在尝试做一些无效的事情,但可能有比我更聪明的人知道正确的语法来解决我的问题。 给定:

1000
500
如果我使用
/*[@code=“vehicle”]/*[@code=“car”]//*[@code=“price”]
,我将返回两个框(1000.00和500.00)——如预期,但不是我想要的


是否有一种xpath语法可以针对所有具有@code属性的节点进行计算,而不是跳过它,如果它与最终结果不匹配,即我只返回第一个框(价格为1000.00)?像询问一样,选择第一个节点为@code且@code必须等于“vehicle”,然后选择下一个节点为@code且@code必须等于“car”,然后选择下一个节点为@code且@code必须等于“price”。

不是xpath方面的专家,但XmlSpy似乎表明这是可行的

(//*[@code="vehicle"]//*[@code="car"]//*[@code="price"])[1]
使用

   "//box
       [(@code='car' or @code='price' or @code='vehicle')
      and
       not(
             ancestor-or-self::*
                   [
                       @code
                      and
                       not(@code='car'
                              or
                               @code='price'
                              or
                               @code='vehicle'
                           )

                   ]
               )
       ]

这对我来说没用,但我明白我的解释是如何得出你的答案的。虽然union操作符确实得到了所有三个匹配的节点,这听起来可能像我所要求的,但我只寻找最深的节点
1000.00
,其中上面@code的每个外观都与xpath表达式匹配。我不想让第二个盒子匹配,因为它在路径中有“运动”,因此无效。另一种思考方式是:我想要一个框,其中每个@代码都与标准匹配,并且只有在那里才匹配。我把这个框拉到了我原始文档的一个片段上,它看起来非常有希望。我将在一些更复杂的场景中尝试它,看看它是否适用于我的所有排列。谢谢,迪米特。不幸的是,这对我不起作用。如果
节点的顺序被切换,那么我将得到错误的节点。根据Dimitre的回答,对我来说,稍加修改的表达式(b/c它维护层次结构中的顺序)是
/*[@code=“vehicle”]/*[@code=“car”]/*[@code=“car”]/*[(@code=“price”)而不是(祖先:*[@code=“vehicle”或@code=“car”或@code=“price”)])
   "//box
       [(@code='car' or @code='price' or @code='vehicle')
      and
       not(
             ancestor-or-self::*
                   [
                       @code
                      and
                       not(@code='car'
                              or
                               @code='price'
                              or
                               @code='vehicle'
                           )

                   ]
               )
       ]