我有一个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(),'-','')
有没有办法实现这一目标?
答案 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,'-','')"
abc cde
PS 请勿将function calls与location 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不同,您需要使用此转换函数。