XQuery - удаляет тег, но оставляет его текст - PullRequest
2 голосов
/ 26 февраля 2011

Как я могу удалить набор тегов в XQuery, но при этом оставить его текст там?Например, если у меня есть:

<root>
    <childnode>This is <unwantedtag>some text</unwantedtag> that I need.</childnode>
</root>

Как мне удалить нежелательный тег, чтобы получить:

<root>
    <childnode>This is some text that I need.</childnode>
</root>

На самом деле, что я действительно хочу закончить, это просто текстНапример:

This is some text that I need.

Когда я делаю следующее:

let $text := /root/childnode/text()

Я получаю:

This is  that I need.

В нем отсутствует часть some text.

Есть идеи как вернуть This is some text that I need.?

Спасибо.

Ответы [ 3 ]

4 голосов
/ 27 февраля 2011

Вас не интересует строковое значение childnode (в отличие от последовательности текстовых узлов или упрощенного элемента)? Вы можете получить строковое значение из fn: string :

string(/root/childnode)
2 голосов
/ 26 февраля 2011

Используйте

/*/childnode//text()

Когда этот XQuery оценивается по предоставленному XML-документу:

<root>
 <childnode>This is <unwantedtag>some text</unwantedtag> that I need.</childnode>
</root>

желаемый, правильный результат получается:

This is some text that I need.
0 голосов
/ 26 февраля 2011

Это XQuery:

declare function local:copy($element as element()) {
   element {node-name($element)}
           {$element/@*,
            for $child in $element/node()
            return if ($child instance of element())
                   then local:match($child)
                   else $child
           }
};
declare function local:match($element as element()) {
   if ($element/self::unwantedtag)
   then for $child in $element/node()
        return if ($child instance of element())
               then local:match($child)
               else $child
   else local:copy($element)
};
local:copy(/*)

Выход:

<root>
    <childnode>This is some text that I need.</childnode>
</root>
...