2016-01-18 8 views
1

Я знаю, что xmlns определяет пространство имен, но я немного запутался в его использовании в XSD-файле (это пример, приведенный в кодесинтезе).Определение и ссылка на типы XSD в пространствах имен

<?xml version="1.0"?> 

<!-- 

file  : examples/cxx/parser/library/library.xsd 
copyright : not copyrighted - public domain 

--> 

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:lib="http://www.codesynthesis.com/library" 
      targetNamespace="http://www.codesynthesis.com/library"> 

    <xsd:simpleType name="isbn"> 
    <xsd:restriction base="xsd:unsignedInt"/> 
    </xsd:simpleType> 


    <xsd:complexType name="title"> 
    <xsd:simpleContent> 
     <xsd:extension base="xsd:string"> 
     <xsd:attribute name="lang" type="xsd:string"/> 
     </xsd:extension> 
    </xsd:simpleContent> 
    </xsd:complexType> 


    <xsd:simpleType name="genre"> 
    <xsd:restriction base="xsd:string"> 
     <xsd:enumeration value="romance"/> 
     <xsd:enumeration value="fiction"/> 
     <xsd:enumeration value="horror"/> 
     <xsd:enumeration value="history"/> 
     <xsd:enumeration value="philosophy"/> 
    </xsd:restriction> 
    </xsd:simpleType> 


    <xsd:complexType name="person"> 
    <xsd:sequence> 
     <xsd:element name="name" type="xsd:string"/> 
     <xsd:element name="born" type="xsd:string"/> 
     <xsd:element name="died" type="xsd:string" minOccurs="0"/> 
    </xsd:sequence> 
    </xsd:complexType> 


    <xsd:complexType name="author"> 
    <xsd:complexContent> 
     <xsd:extension base="lib:person"> 
    <xsd:attribute name="recommends" type="xsd:IDREF"/> <!-- Book --> 
     </xsd:extension> 
    </xsd:complexContent> 
    </xsd:complexType> 


    <xsd:complexType name="book"> 
    <xsd:sequence> 
     <xsd:element name="isbn" type="lib:isbn"/> 
     <xsd:element name="title" type="lib:title"/> 
     <xsd:element name="genre" type="lib:genre"/> 
     <xsd:element name="author" type="lib:author" maxOccurs="unbounded"/> 
    </xsd:sequence> 
    <xsd:attribute name="available" type="xsd:boolean" use="required"/> 
    <xsd:attribute name="id" type="xsd:ID" use="required"/> 
    </xsd:complexType> 


    <xsd:complexType name="catalog"> 
    <xsd:sequence> 
     <xsd:element name="book" type="lib:book" maxOccurs="unbounded"/> 
    </xsd:sequence> 
    </xsd:complexType> 


    <xsd:element name="catalog" type="lib:catalog"/> 

</xsd:schema> 

Почему новые типы, которые определяются как person, author упоминаться с префиксом lib пространства имен, но не с xsd префиксом, где оба определены в документе? Что делает их принадлежащими lib, но не xsd?

Во-вторых, они указаны автономно, если они определены, но они имеют префикс пространства имен, когда они используются. Разве они не должны быть определены с префиксом пространства имен?

Например, author не имеет Lib префикс, когда он определен, но он использует lib:person с префиксом пространства имен (а также, когда author используется в дальнейшем, он принадлежит к lib!). Это добавляет путаницы!

<xsd:complexType name="author"> 
    <xsd:complexContent> 
     <xsd:extension base="lib:person"> 
    <xsd:attribute name="recommends" type="xsd:IDREF"/> <!-- Book --> 
     </xsd:extension> 
    </xsd:complexContent> 
    </xsd:complexType> 

ответ

1

Почему новые типы, которые определяются как person, author упоминаться с Lib префиксом пространства имен, но не с xsd префиксом, где и определены в документе? Что делает их принадлежащими lib, но не до xsd?

Приставка xsd пространства имен определяются

xmlns:xsd="http://www.w3.org/2001/XMLSchema" 

Это пространство зарезервировано для XML-схема конструкций.

Префикс lib пространство имен определяется

xmlns:lib="http://www.codesynthesis.com/library" 

Это пространство определяется пользователем (контролируется Codesynthesis, в данном случае, для его компонентов).

Во-вторых, они указаны автономно, когда они определены, но они имеют префикс пространства имен, когда они используются. Должны ли они быть с префиксом пространства имен?

Нет, для TargetNamespace декларации, такие как:

targetNamespace="http://www.codesynthesis.com/library" 

Определение типа, таких как author (без префикса пространства имен здесь),

<xsd:complexType name="author">...</xsd:complexType> 

автоматически в http://www.codesynthesis.com/library пространстве имен , но должны быть указаны через соответствующий префикс пространства имен, type="lib:author".

+0

'targetNamespace' и' xmlns' меня путают. Является ли 'xmlns' примерно равным' using namespace' в C++ и 'targetNamspace', объявляя ваше собственное пространство имен? – zar

+0

Я думал, что 'xmlns' делает то, что кажется' targetNamespace', т. Е. Назначает теги определенному пространству имен. – zar

+0

'xs: schema/@ targetNamespace =" '*** namespaceURI ***' '' объявляет, что компоненты, определенные в этой схеме, находятся в пространстве имен *** namespaceURI ***. Это отличается от 'xmlns', который используется (1) для определения префикса пространства имен * или * (2) для определения пространства имен по умолчанию. – kjhughes

1

Атрибут targetNamespace в теге схемы определяет пространство имен, в котором определены элементы текущей схемы. в вашем примере это «http://www.codesynthesis.com/library». Все типы, атрибуты и элементы, определенные в документах, принадлежат пространству targetNamespace. Чтобы получить ссылку на один из них, вам нужно определить xmlns для пространства имен (в вашем примере xmlns: lib = "http://www.codesynthesis.com/library"). Поэтому вы должны использовать определенный префикс «lib» только тогда, когда вы получаете ссылку на тип, определенный в схеме. Кстати, вы можете определить целевое пространство имен как пространство имен по умолчанию (xmlns = "http://www.codesynthesis.com/library"), и префикс не нужен для вашего целевого пространства имен.