Ваш желаемый результат фактически не действителен, так как он не включает определение пространства имен 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.
"(Saxon не добавляет пространство имен по умолчанию, если в нем нет элемента - другие реализации могут вести себя по-разному)" - если это так, такая реализация не соответствует спецификации –
@MichaelKay Я ее отредактировал. Я не знал, что спецификация говорит, что не следует добавлять объявление в этом случае. – Matthew