Как преобразовать строку в узел в XQuery?

Я хотел бы преобразовать строку в узел. У меня есть метод, который определен для получения узла, но значение, которое у меня есть, представляет собой строку (она жестко закодирована). Как превратить эту строку в узел?

Итак, учитывая метод XQuery:

define function foo($bar as node()*) as node() {
  (: unimportant details :)
}

У меня есть строка, которую я хочу передать методу foo. Как преобразовать строку в узел, чтобы метод принял строку.


person Sixty4Bit    schedule 23.09.2008    source источник
comment
Содержит ли строка какой-то экранированный XML, который вы хотите преобразовать в узел, или вы просто хотите превратить строку в текстовый узел, чтобы передать его этой конкретной функции?   -  person JeniT    schedule 26.09.2008


Ответы (5)


Решения MarkLogic:

Лучший способ преобразовать строку в узел — использовать:

xdmp:unquote($string).

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

xdmp:quote($node).

Решения, не зависящие от языка:

Узел для строки:

fn:string($node)
person Sixty4Bit    schedule 23.09.2008
comment
xdmp:unquote и quote не являются частью спецификации языка XQuery, они являются частью набора библиотек расширения MarkLogic. Загрузка xml из строковых литералов в узел зависит от используемого механизма XQuery. xml.com/lpt/a/1660 - person Jim Burger; 23.09.2008
comment
Кроме того, ваш код из узла в строку, вероятно, не делает то, что хочет плакат - он вернет только объединенное строковое значение всех узлов ниже $node, но не фактический синтаксис XML (‹foo/›) - person Martin Probst; 20.10.2008
comment
Я ненавижу принимать свой собственный ответ, но это то, что я искал и решил проблему, с которой я столкнулся. Нужно ли переформулировать вопрос? - person Sixty4Bit; 12.03.2009
comment
Это разумный способ спросить. Вы также могли спросить, как разобрать (или десериализовать) строку в XML. - person Eric Bloch; 07.03.2012

Если вы хотите создать узел text из строки, просто используйте конструктор узла text:

text { "your string goes here" }

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

element (some-element) { "your string goes here" }
person Community    schedule 09.11.2008

Если вы говорите о строках, содержащих XML-разметку, также существуют стандартизированные решения (из XPath/XQuery Functions 3.0):

person mb21    schedule 02.08.2012

Ответ на этот вопрос зависит от того, какой двигатель используется. Например, пользователи Saxon используют метод saxon:parse.

Дело в том, что спецификация XQuery не имеет для этого встроенных функций.

Вообще говоря, вам действительно нужно использовать это, только если вам нужно извлечь некоторый встроенный XML из раздела CDATA. В противном случае вы можете считывать файлы из файловой системы или объявить XML непосредственно встроенным.

В большинстве случаев вы будете использовать декларативную форму вместо жестко закодированной строки, например. (используя Stylus Studio)

declare namespace my = "http://tempuri.org";

declare function my:foo($bar as node()*) as node() {
    <unimportant></unimportant>
} ;

let $bar := <node><child></child></node>

return my:foo(bar)
person Jim Burger    schedule 23.09.2008

вы также можете использовать fn:parse-xml(xs:string) для преобразования вашей текущей допустимой строки XML в документ.

person the hand of NOD    schedule 09.06.2021