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

Era*_*dan 6 xpath

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

例如

<xmlDoc>
   <items>
      <item>a-b-c</item>
      <item>c-d-e</item>
   <items>
</xmlDoc>
Run Code Online (Sandbox Code Playgroud)

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

/xmldoc/items/item[1]/translate(text(),'-','')
Run Code Online (Sandbox Code Playgroud)

哪个会回归

"ABC"

但是,我如何为整套设备做到这一点?

这不起作用

/xmldoc/items/item/translate(text(),'-','')
Run Code Online (Sandbox Code Playgroud)

也不是这个

translate(/xmldoc/items/item/text(),'-','')
Run Code Online (Sandbox Code Playgroud)

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

Dim*_*hev 13

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

/xmldoc/items/item[1]/translate(text(),'-','')
Run Code Online (Sandbox Code Playgroud)

哪个会回归

"abc"
Run Code Online (Sandbox Code Playgroud)

但是,我如何为整套设备做到这一点?

单个XPath 1.0表达式无法完成此操作.

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

/xmlDoc/items/item/translate(.,'-', '')
Run Code Online (Sandbox Code Playgroud)


Emi*_*ggi 5

translate函数在输入中接受一个字符串不是一个节点集。这意味着编写如下内容:

"translate(/xmlDoc/items/item/text(),'-','')"
Run Code Online (Sandbox Code Playgroud)

或者

"translate(/xmlDoc/items/item,'-','')"
Run Code Online (Sandbox Code Playgroud)

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

在 XPath 1.0 中,我认为除了做一些丑陋的事情外,你别无选择:

"concat(translate(/xmlDoc/items/item,'-',''),
 translate(/xmlDoc/items/item[2],'-',''))"
Run Code Online (Sandbox Code Playgroud)

这对于大量项目是私有的,并且只返回一个 string


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

  "for $item in /xmlDoc/items/item  
    return replace($item,'-','')"
Run Code Online (Sandbox Code Playgroud)

它返回一个序列类型

abc cde
Run Code Online (Sandbox Code Playgroud)

PS不要将函数调用位置路径混淆。它们是不同种类的表达式,在 XPath 1.0 中不能混合使用。