Как использовать функцию" 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 нельзя смешивать.