在命名空间中定义和引用 XSD 类型

Defining and referencing XSD types in namespaces

我知道 xmlns 定义了一个命名空间,但我对它在 XSD 文件中的使用有点困惑(这是 codesynthesis 提供的示例)。

<?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>

为什么像 personauthor 这样定义的新类型使用 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>

架构标记中的 targetNamespace 属性定义了定义当前架构元素的命名空间。在您的示例中,这是“http://www.codesynthesis.com/library”。文档中定义的所有类型、属性和元素都属于目标命名空间。为了获得对其中之一的引用,您需要为命名空间定义 xmlns(在您的示例中 xmlns:lib="http://www.codesynthesis.com/library")。因此,仅当您获得对模式中定义的类型的引用时,才必须使用定义的前缀 "lib"。顺便说一下,您可以将目标命名空间定义为默认命名空间 (xmlns="http://www.codesynthesis.com/library"),并且您的目标命名空间不需要前缀。

Why are the new types which are defined like person, author referenced with lib namespace prefix but not with xsd prefix, where both are defined in document? What makes them belong to lib but not to xsd?

xsd 命名空间前缀由

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

此命名空间为 XML 架构构造保留。

lib 命名空间前缀由

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

此命名空间是 user-defined(由 Codesynthesis 控制,在本例中,是针对其组件)。

Secondly they are referenced standalone when they are defined but they have namespace prefix when they are being used. Shouldn't they be defined with namespace prefix as well?

否,对于 targetNamespace 声明,例如:

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

类型的定义,例如author(此处没有名称空间前缀),

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

自动位于 http://www.codesynthesis.com/library 命名空间中,但必须通过相应的命名空间前缀 type="lib:author".

进行引用