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