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
Xml XPath仅在节点存在时获取同级计数_Xml_Xpath - Fatal编程技术网

Xml XPath仅在节点存在时获取同级计数

Xml XPath仅在节点存在时获取同级计数,xml,xpath,Xml,Xpath,我有一个包含表信息(列标题和行)的XML 我面临的问题是,当没有phoneNumber列时,当我将+1添加到前面的同级值时,它将始终返回第一行/列值 如何在xpath中处理此场景。也就是说,如果“电话号码”存在,那么只有我应该识别兄弟姐妹并添加1。另一方面,它应该返回0作为索引。xpath中是否有任何函数可用于处理此场景。我正在使用XPATH1.0。您可以检查布尔表达式。/../colHeading='phoneNumbr'以查看该列是否存在,然后使用类型转换规则-将布尔值转换为数字时,0表示f

我有一个包含表信息(列标题和行)的XML

我面临的问题是,当没有phoneNumber列时,当我将+1添加到前面的同级值时,它将始终返回第一行/列值


如何在xpath中处理此场景。也就是说,如果“电话号码”存在,那么只有我应该识别兄弟姐妹并添加1。另一方面,它应该返回0作为索引。xpath中是否有任何函数可用于处理此场景。我正在使用XPATH1.0。

您可以检查布尔表达式
。/../colHeading='phoneNumbr'
以查看该列是否存在,然后使用类型转换规则-将布尔值转换为数字时,0表示false,1表示true

.//row/col[count(../../colHeading[.='phoneNumbr']/preceding-sibling::*)
       + boolean(../../colHeading = 'phoneNumbr')]/text()
当没有phoneNumbr列时,这将返回一个空节点集

在谓词中使用
text()
显然是多余的,末尾的一个可能是,也可能不是,这完全取决于您对结果节点集所做的操作。

实现这一点的一个可能的方法是从
的下一个同级开始计算前一个同级。这样您就不需要添加
+1

//row/col[
       count(../../colHeading[. = 'phoneNumber']/following-sibling::*[1]/preceding-sibling::*)
    ]/text()
令人惊讶的是,这甚至适用于
没有以下兄弟姐妹的情况,例如:

<Table> 
      <colHeading>name</colHeading>
      <colHeading>phoneNumber</colHeading>
      <row>
          <col>jack</col>   
          <col>9123456352</col>
      </row>
</Table>

名称
电话号码
杰克
9123456352

您不需要它来返回0作为索引,只需在
选择中添加一个谓词
[前面的兄弟姐妹::colHeading='phoneNumber']

例子:
因此,如果phoneNumber不存在,行/col[0]将不会返回任何值。我尝试了此操作,但不起作用。条件布尔(../colHeading='phoneNumber')将始终返回false…而且我不确定“+”如何在boolean@Andromeda很抱歉,路径错误,它需要另一个
。/
。您可以像最初一样在谓词中使用
/
,但我倾向于尽可能地本地化我的路径,即查看此表中的列标题,而不是文档中的任何地方(在这种情况下,它们都是相同的,但为了效率,最好尽量远离
/
).@Andromeda和
+
运算符自动将其参数转换为数字,因此
x+布尔值
x
表示false,
x+1
表示true。毫不奇怪……在这种情况下,标记行是“colHeading”的同级。从这里开始,前面的同级将给出准确的计数:-)@Andromeda您是对的,只是太关注于
col
s和
colHeading
s可能是:D
//row/col[
       count(../../colHeading[. = 'phoneNumber']/following-sibling::*[1]/preceding-sibling::*)
    ]/text()
<Table> 
      <colHeading>name</colHeading>
      <colHeading>phoneNumber</colHeading>
      <row>
          <col>jack</col>   
          <col>9123456352</col>
      </row>
</Table>
.//row
[
    preceding-sibling::colHeading = 'phoneNumber'
]
/col
[
    count(../../colHeading[. = 'phoneNumber']/preceding-sibling::*)+1
]
/text()