XQuery: возвращает значение элемента, а не самого элемента

21

У меня есть документ XML, который содержит следующее

...
<foo>abc</foo>
...

Если я оцениваю

return $xml//foo

Я вернусь

<foo>abc</foo>

Есть ли способ получить только abc ?

    
задан kpozin 20.07.2009 в 20:51
источник

5 ответов

26

Да, вам нужна функция text () для выбора дочернего текста:

return $xml/text()

Будьте осторожны, если у вас будет вложенная структура тегов внутри $ xml, потому что это будет только на один уровень глубины для текстовых узлов. Если вы хотите, чтобы все текстовые узлы были объединены, исключая другую структуру XML, это будет сделано сколь угодно глубоко:

return $xml//text()
    
ответ дан Harold L 20.07.2009 в 20:54
  • text () не является функцией. Это тест узла. Перед тем, как вы отправите текст () сумасшедшим, см. Сообщение Эвана Ленца «text () - это запах кода», а также сообщение Дэйва Касселя, которое я связал ниже, после ответа Оливера и ответа Павла. –  joewiz 03.03.2013 в 04:39
15

Используйте строковую функцию, чтобы получить строковое содержимое узла.

return string($xml)
    
ответ дан Oliver Hallam 21.07.2009 в 15:39
  • Это на самом деле более идиоматическая и лучшая альтернатива, чем предпочтительный ответ выше. Он также будет корректно обрабатывать любые вложения дочерних узлов. –  Pavel Minaev 27.07.2009 в 22:08
  • Действительно. См. Объяснение Дэвида Касселя различий между text (), fn: string () и fn: data () - все три из них до сих пор появлялись в трех ответах. –  joewiz 03.03.2013 в 04:36
8

Чтобы вернуть только данные внутри элемента, вы можете использовать:

return data($xml)
    
ответ дан SeeJay 19.09.2009 в 11:14
  • Точнее, fn: data () - это функция, которая дает вам атомизированное значение последовательности узлов, т.е. типизированное значение каждого узла; в то время как fn: string () дает вам строковое значение узла. См. Ссылки, которые я посыпал вышеприведенными комментариями, чтобы узнать больше о различиях между text (), fn: string () и fn: data (). –  joewiz 03.03.2013 в 04:43
0

Привести к xs: string {xs:string($xml/foo)}

    
ответ дан savemaxim 20.05.2013 в 13:29
0

Пользователи OSB (служебная шина oracle) могут использовать следующую функцию.

fn-bea:serialize($xml)

    
ответ дан Aniruddha Jagtap 15.12.2014 в 11:22