Как преобразовать строку в узел в XQuery? - PullRequest
5 голосов
/ 23 сентября 2008

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

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

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

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

Ответы [ 4 ]

10 голосов
/ 23 сентября 2008

Решения MarkLogic:

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

xdmp:unquote($string).

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

xdmp:quote($node).

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

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

fn:string($node)
9 голосов
/ 10 ноября 2008

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

text { "your string goes here" }

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

element (some-element) { "your string goes here" }
8 голосов
/ 02 августа 2012

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

3 голосов
/ 23 сентября 2008

Ответ на этот вопрос зависит от того, какой двигатель используется. Например, пользователи 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)
...