我可以通过ID来引用XSD类型吗?

时间:2013-10-24 02:17:33

标签: xml xsd

看起来XSD中的每个标签都有一个可以指定的可选ID属性,但有什么意义呢?我想通过使用它来引用一种类型,但我不确定这是否可行。

示例:通常有人会使用名称

<xsd:simpleType name="myType" id="1">
  <xsd:restriction base="xsd:string/>
</xsd:simpleType>

<xsd:complexType name="myDerivedType>
  <xsd:simpleType ref="myType"/>
</xsd:complexType>

相反,我想用这个:

<xsd:simpleType name="myType" id="1">
  <xsd:restriction base="xsd:string/>
</xsd:simpleType>

<xsd:complexType name="myDerivedType>
  <xsd:simpleType refById="1"/>
</xsd:complexType>

并且它仍然具有相同的效果。基本上,我想要两种方法之一来引用一个简单的类型。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

id属性的用途

id属性有助于在URI中将简写或简写XPointer用作片段标识符:

XML Schema Part 1: Structures > 3.15.2.2 References to Schema Components from Elsewhere

  

模式组件的名称(例如类型定义和元素声明)不是ID类型:它们在模式内不是唯一的,只是在符号空间内是唯一的。这意味着简单的片段标识符将始终无法从架构文档的上下文之外引用架构组件。

     

[...]

     

在某些情况下,也可能使用短格式的片段标识符,即当DTD或XML模式可用于所讨论的模式,并且为所有主对象和对象的表示提供id属性时类型ID的辅助模式组件已被利用。

片段标识符是uri的一部分(例如https://www.example.com/#fragment-identifier)-标识符的处理方式取决于媒体类型:

RFC 3986: Uniform Resource Identifier (URI): Generic Syntax > 3.5. Fragment

  

因此,片段的格式和分辨率为   取决于可能检索到的媒体类型[RFC2046]   表示,即使仅当   URI被取消引用。

对于XML,片段标识符是XPointers:

RFC 7303: XML Media Types > 5. Fragment Identifiers

  

XML媒体的片段标识符的语法和语义   本规范中定义的类型基于   [XPointerFramework] W3C建议。

XPointer框架将速记指针指定如下:

XPointer Framework > 3.2 Shorthand Pointer

  

一个简写指针,以前称为裸名,仅由一个NCName组成。它最多标识资源信息集中的一个元素;具体而言,按文档顺序排列的第一个(如果有)具有匹配的NCName作为标识符。元素的标识符确定如下:

     
      
  1. 如果元素信息项的 [attributes] 中有一个属性信息项,它是模式确定的ID,则由该属性信息项的[schema归一化值]的值来标识财产;
  2.   

应注意,XSD ID类型(xs:ID)和具有这种类型的id属性不是数字的,您在示例中使用的值(1)对于id属性无效:

XML Schema Part 1: Structures > 3.14.2 (non-normative) XML Representation of Simple Type Definition Schema Components

<simpleType
     

[...]

  id = ID

(架构第2部分:数据类型> 3.3.8 ID)[https://www.w3.org/TR/xmlschema-2/#ID]

  

[定义:] ID 表示[XML 1.0(第二版)]中的ID属性类型。 ID 的值空间是与[XML的名称空间]中的NCName产生匹配的所有字符串的集合。 ID的词法空间是与[XML的命名空间]中的NCName产生匹配的所有字符串的集合。 ID 的基本类型是NCName。

Namespaces in XML > 2. Declaring Namespaces

[4]   NCName  ::= (Letter | '_') (NCNameChar)*    /*  An XML Name, minus the ":" */
[5]   NCNameChar  ::= Letter | Digit | '.' | '-' | '_' | CombiningChar | Extender

通过id引用其他架构组件

在XSD本身中,id不能引用其他XSD组件(包括XSD类型)。 XSD中指定用于引用其他架构组件的唯一语义是通过QName。例如:

XML Schema Part 1: Structures > 3.3.2 XML Representation of Element Declaration Schema Components

<element
     

[...]

  ref = QName
  substitutionGroup = QName
  type = QName

QName在XML模式中定义如下:

XML Schema Part 2: Datatypes > 3.2.18 QName

  

[定义:] QName表示XML限定名称。 QName的值空间是元组的集合{namespace name,local part},其中名称空间名称是anyURI,而本地部分是NCName。 QName的词法空间是与[Namespaces in XML]的QName产生匹配的字符串集。

     

注意:QName的词法空间中的文字和值空间的值之间的映射要求在使用QName的上下文中要包含名称空间声明。 / p>

Namespaces in XML 1.0 > 4 Qualified Names

[7]     QName             ::= PrefixedName
                              | UnprefixedName
[8]     PrefixedName      ::= Prefix ':' LocalPart
[9]     UnprefixedName    ::= LocalPart

将QName解析为架构组件的过程定义为:

XML Schema Part 1: Structures > 3.15.3 Constraints on XML Representations of Schemas

  

模式表示约束:QName解析(模式文档)

     

要使QName解析为指定种类的架构组件,必须满足以下所有条件:

     

[...]

     

2组件的{name}与·QName·的·本地名称匹配;

     

[...]

{name} 是指组件的name属性:

XML Schema Part 1: > 3.2.2 XML Representation of Attribute Declaration Schema Components

  

{名称} name [属性]的·实际值

XML Schema Part 1: > 3.3.2 XML Representation of Element Declaration Schema Components

  

{名称} name [属性]的·实际值

XML Schema Part 1: > 3.4.2 XML Representation of Complex Type Definitions

  

{name} name [attribute]的实际值,如果存在,则不存在。

最后,XSD中唯一引用其他模式组件的语义是使用它们的名称。