Как использовать функцию «translate» Xpath для набора узлов - PullRequest
6 голосов
/ 30 июня 2011

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

например.

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

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

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

Который вернется

"а"

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

Это не работает

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

Ни это

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

Есть ли способ достичь этого?

Ответы [ 2 ]

13 голосов
/ 01 июля 2011

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

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

Который вернется

"abc"

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

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

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

/xmlDoc/items/item/translate(.,'-', '')
4 голосов
/ 01 июля 2011

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

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

или

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

приведет к вызову функции только на первом узле (item[1]).

InXPath 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 их нельзя смешивать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...