Как использовать функцию" translate " Xpath на наборе узлов

у меня есть XML-документ, который содержит элементы с тире, которые я хотел бы удалить

например

<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(),'-','')

есть ли вообще способ достичь этого?

2 ответов


Я знаю, что могу найти-заменить один элемент с помощью этого xpath

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

что вернет

"abc"

однако, как мне это сделать для весь набор?

это невозможно сделать с помощью одного выражения XPath 1.0.

используйте следующее выражение XPath 2.0 для получения последовательности строк, каждая из которых является результатом применения в строке значение соответствующего узла:

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

на translate функция принимает во вход a строка и не набор узлов. Это означает, что писать что-то вроде:

"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 не путай звонки С путь к расположению. Они являются разного рода выражениями, и в XPath 1.0 нельзя смешивать.