如何在节点集上使用“translate”Xpath函数

时间:2011-06-30 18:40:25

标签: xpath

我有一个XML文档,其中包含我想要删除的破折号

e.g。

<xmlDoc>
   <items>
      <item>a-b-c</item>
      <item>c-d-e</item>
   <items>
</xmlDoc>

我知道我可以找到 - 使用此xpath替换单个项目

/xmldoc/items/item[1]/translate(text(),'-','')

将返回

  

“ABC”

但是,如何为整套设置执行此操作?

这不起作用

/xmldoc/items/item/translate(text(),'-','')

也不是这个

translate(/xmldoc/items/item/text(),'-','')

有没有办法实现这一目标?

3 个答案:

答案 0 :(得分:13)

  

我知道我可以找到 - 替换一个   使用此xpath的项目

/xmldoc/items/item[1]/translate(text(),'-','')
     

将返回

"abc"
     

然而,我该怎么做呢   整套?

使用单个XPath 1.0表达式无法完成。

使用以下XPath 2.0表达式生成一系列字符串,每个字符串都是translate()函数应用于相应节点的字符串值的结果:

/xmlDoc/items/item/translate(.,'-', '')

答案 1 :(得分:4)

translate函数在输入中接受字符串节点集。这意味着写下这样的东西:

"translate(/xmlDoc/items/item/text(),'-','')"

"translate(/xmlDoc/items/item,'-','')"

将仅在第一个节点上调用函数(item[1])。

在XPath 1.0中,我认为除了做一些丑陋的事情之外别无他法:

"concat(translate(/xmlDoc/items/item,'-',''),
 translate(/xmlDoc/items/item[2],'-',''))"

这对于大量项目很有用,而只返回一个字符串


XPath 2.0 中,使用表达式可以很好地解决这个问题:

  "for $item in /xmlDoc/items/item  
    return replace($item,'-','')"

返回sequence type

abc cde

PS 请勿将function callslocation paths混淆。它们是不同类型的表达式,在XPath 1.0中不能混用。

答案 2 :(得分:0)

这是另一个示例,它是在进行硒测试之前针对chrome开发人员工具运行的。

$x("//table[@id='sometable_table']//tr[1=1 and ./td[2=2 and position()=2 and .//*[translate(text(), ',', '') ='1001']  ]  ]/td[position()=2]")

本质上,数据sometable_table的一列包含显示为本地化的数字。例如,1001将显示为1,001。有了上面的内容,您的xpath表达式就会有些讨厌。

首先在其中选择所有表行。然后,将重点放在该行的位置2表数据的数据上。然后,您将深入研究position = 2表数据的内容,在单元格上展开数据,直到找到字符串替换后文本为1001的任何节点。最后,您要求返回位置2的表。

但是,由于所有主要过滤器都位于表行级别,因此,如果您需要在单元格上找到包含内容(A)的适当表行,那么也可以在其他位置的表数据列处进行其他过滤器列和内容(B)在另一列上。

注意: 写这个实际上是很讨厌的,因为从直觉上来说,我们所有人都用Google的XPATH替换了字符串。因此,我开始尝试使用xpath替换,直到我意识到chrome支持XPATH 1.0。在xpath 1.0中,存在的字符串函数与xpath 2.0不同,您需要使用此转换函数。

请参阅参考资料: http://www.edankert.com/xpathfunctions.html