2015-12-09 3 views
4

Я пытаюсь вставить новые элементы в XML-документ, используя BaseX.узел xquery insert из внешнего xs: строковая переменная (basex)

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

Я использую GUI 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 символ преобразуется в последовательность символов XML побег например пример: < становится & lt;

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

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

ответ

3

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

+0

Я пробовал функцию fn: parse-xml, мой xml имеет префикс пространства имен и функция parse-xml возвращает ошибку – mikee

+0

Я пробовал функцию fn: parse-xml, мой xml имеет префикс пространства имен (asy) и Функция parse-xml возвращает ошибку FODC0006 (строка 1): префикс «asy» для элемента «asy: part» не связан. Если я добавлю оператор пространства имен для asy впереди xml, я получаю другую ошибку. FODC0006 (строка 1): содержимое не допускается в прологе. Однако, если я использую запрос: функция eval ($ part), похоже, работает. – mikee

+1

Если у содержимого есть необъявленный префикс пространства имен, parse-xml вполне прав, чтобы его отклонить. query: eval() звучит как расширение поставщика, поэтому ему разрешено делать все, что ему нравится. –