2016-02-25 3 views
0

Для каждого файла rdf в начале файла есть объявление пространства имен. Я хочу создать узел ниже.генерировать rdf-файл с помощью XQuery: «xmlns»: недопустимое имя узла;

<rdf:RDF 
xmlns="http://www.w3.org/2002/07/owl#"> 

Я пытаюсь создать его с элементом конструктора:

declare namespace rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"; 
declare namespace owl="http://www.w3.org/2002/07/owl#"; 

element {xs:QName("rdf:RDF")} {attribute xmlns {"http://www.w3.org/2002/07/owl#"}} 

ошибку из CMD линии:

test.xqy>: 20,48: динамическая ошибка [ERR: XQDY0044] : "xmlns": недопустимое имя узла; поднял на /tmp/zorba20151126-72875-uij83f/zorba-3.0/src/runtime/core/constructors.cpp:669

Похоже, атр Xmlns не разрешается использовать подобное. Есть ли способы?

ответ

1

Ваш желаемый результат фактически не действителен, так как он не включает определение пространства имен rdf, а xmlns на самом деле не является атрибутом (технически, но он является особым), но является объявлением пространства имен. Рассмотрение его как обычного атрибута приведет к ошибке, потому что спецификация XML резервирует это имя для использования только для идентификаторов пространства имен. Если вы просто делаете

declare namespace rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"; 
declare namespace owl="http://www.w3.org/2002/07/owl#"; 

element {xs:QName("rdf:RDF")} {} 

вы получите правильный вывод формы,

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns-#"/> 

Это справедливо, так как она включает в себя декларацию пространства имен РДФ. То, что запрашивает ваш синтаксис, - это пространство имен по умолчанию, которое включает в себя все элементы, которые не попадают в другое пространство имен. Мы можем сделать это с помощью пролог заявления:

declare default element namespace "http://www.w3.org/2002/07/owl#"; 
declare namespace rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"; 
declare namespace owl="http://www.w3.org/2002/07/owl#"; 

element {xs:QName("rdf:RDF")} {} 

, который будет добавлять пространство имен, если элемент существует, что не в пространстве имен RDF (объявление пространства имен по умолчанию не добавляется, если элемент не существует в нем). Например, замена конструктора элемента с element {xs:QName("rdf:RDF")} {<t/>} (объявляющего элемент t, который находится в пространстве имен по умолчанию) производит

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
    <t xmlns="http://www.w3.org/2002/07/owl#"/> 
</rdf:RDF> 

что эквивалентно до нужного выхода (насколько пространства имен семантика обеспокоены).

В XQuery 3.0 мы можем напрямую построить узел пространства имен. Использование

declare namespace rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"; 
declare namespace owl="http://www.w3.org/2002/07/owl#"; 

element {xs:QName("rdf:RDF")} { 
    namespace {""} {"http://www.w3.org/2002/07/owl#"} 
} 

который производит

<rdf:RDF xmlns="http://www.w3.org/2002/07/owl#" 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"/> 

размещения декларации пространства имен по умолчанию на внешнем элементе.


  • Все примеры здесь были протестированы с Saxon-HE 9.7.0.2J.
+0

"(Saxon не добавляет пространство имен по умолчанию, если в нем нет элемента - другие реализации могут вести себя по-разному)" - если это так, такая реализация не соответствует спецификации –

+0

@MichaelKay Я ее отредактировал. Я не знал, что спецификация говорит, что не следует добавлять объявление в этом случае. – Matthew

1

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

Как указывает @Matthew, вы можете сделать это в XQuery 3.0 с помощью выражения конструктора пространства имен.

В XQuery 1.0, при условии, что имя элемента известно статически (который я думаю, в данном случае), вы можете добиться того, что вы хотите с помощью прямого конструктора элемента:

<rdf:RDF xmlns="http://www.w3.org/2002/07/owl#" 
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">{ 
    ... content goes here ... 
</rdf:RDF> 

Если вы используете вычисляемый элемент, тогда в XQuery 1.0 желаемый эффект не может быть достигнут. Правила здесь: https://www.w3.org/TR/xquery/#id-ns-nodes-on-elements. Обратите внимание, что декларации пространства имен в прологе не имеют эффекта, кроме как связывать URI с префиксами, которые фактически используются в конструкторе элемента.

Попытка вывода деклараций пространства имен, как если бы они были обычными атрибутами, строго запрещена: помните, что ваш запрос создает дерево XDM, а не лексический XML, а в дереве XDM пространства имен и атрибуты - совершенно разные животные.

Смежные вопросы