xquery вставить узел из внешней xs: строковой переменной (basex)

Я пытаюсь вставить новые элементы в XML-документ с помощью BaseX.

declare variable $part external; 
insert nodes $part as first into db:open("PARTDB")/assembly[@name="ZB09010"]

Я использую графический интерфейс BaseX для тестирования и определил переменную $ part (щелкнув значок $).

Если я использую "локальную" переменную, например,

let $up := <Employee Name="Joe">
    <Personal>
      <SSN>666-66-1234</SSN>
    </Personal>
    <StaffInfo>
      <Position>Doctor</Position>
      <AccountableTo>Jeff</AccountableTo>
    </StaffInfo>
  </Employee>
  return
insert node $up as last into doc('office')/Staff

тогда вставка работает правильно, однако с внешней переменной каждый символ, который является зарезервированным символом xml, преобразуется в последовательность escape-символов xml, например. пример: ‹становится

Мне удалось заставить его работать, заключив переменную в функцию xquery: eval ($ part), но мне это кажется хакерским.

Есть ли другой тип, кроме xs: string, который я должен использовать для предотвращения перевода? Или есть какая-то функция, которую мне нужно использовать с внешней переменной, чтобы предотвратить перевод. Я также попытался обернуть содержимое xml $ part с помощью CDATA, но xml все равно был преобразован в escape-символы.


person mikee    schedule 09.12.2015    source источник


Ответы (1)


Мне кажется, что значение, которое вы предоставляете для $ part, не является узлом, а является строкой, содержащей лексический XML. Преобразование лексического XML в дерево узлов называется синтаксическим анализом, поэтому вам необходимо проанализировать строку, чтобы создать узел (дерево). Вы можете сделать это, вызвав функцию fn: parse-xml.

person Michael Kay    schedule 10.12.2015
comment
Я пробовал функцию fn: parse-xml, мой xml имеет префикс пространства имен, а функция parse-xml возвращает ошибку - person mikee; 10.12.2015
comment
Я пробовал функцию fn: parse-xml, мой xml имеет префикс пространства имен (asy), а функция parse-xml возвращает ошибку FODC0006 (строка 1): префикс asy для элемента asy: part не привязан. Если я добавлю оператор объявления пространства имен для asy перед xml, я получу другую ошибку FODC0006 (строка 1): Content is not allowed in prolog. Однако, если я использую функцию query: eval ($ part), она работает. - person mikee; 10.12.2015
comment
Если у содержимого есть необъявленный префикс пространства имен, тогда parse-xml вполне может отклонить его. query: eval () звучит как расширение поставщика, поэтому ему разрешено делать все, что угодно. - person Michael Kay; 10.12.2015