2

似乎 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>

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

4

1 回答 1

1

如果id属性的目的

id属性有助于在 URI 中使用短格式或简写 XPointer 作为片段标识符:

XML Schema 第 1 部分:结构 > 3.15.2.2 从其他地方引用 Schema 组件

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

[...]

在某些情况下,也可以使用短格式片段标识符,即当 DTD 或 XML 模式可用于所讨论的模式时,以及id为所有主要和次要模式组件的表示提供一个属性,它类型ID,已被利用。

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

RFC 3986:统一资源标识符 (URI):通用语法 > 3.5。分段

因此,片段的格式和分辨率取决于可能检索到的表示的媒体类型 [RFC2046],即使只有在取消引用 URI 时才会执行这样的检索。

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

RFC 7303:XML 媒体类型 > 5. 片段标识符

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

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

XPointer 框架 > 3.2 速记指针

速记指针,以前称为barename,仅由一个NCName 组成。它最多标识资源信息集中的一个元素;具体来说,文档顺序中的第一个(如果有)具有匹配的 NCName 作为标识符。元素的标识符确定如下:

  1. 如果元素信息项在其[attributes]中有一个属性信息项是模式确定的ID,则它由该属性信息项的[schema normalized value]属性的值标识;

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

XML 模式第 1 部分:结构 > 3.14.2(非规范)简单类型定义模式组件的 XML 表示

<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的·词汇空间·是所有字符串的集合,这些字符串·匹配·在[Namespaces in XML] 中的NCName 产生式。ID的·base type·是NCName。

XML 中的命名空间 > 2. 声明命名空间

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

通过引用其他模式组件id

id在 XSD 本身内无法引用其他 XSD 组件(包括 XSD 类型) 。XSD 中为引用其他模式组件指定的唯一语义是通过 QName。例如:

XML 模式第 1 部分:结构 > 3.3.2 元素声明模式组件的 XML 表示

<element

[...]

  ref = QName
  substitutionGroup = QName
  type = QName

QName 在 XML Schema 中定义如下:

XML 模式第 2 部分:数据类型 > 3.2.18 QName

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

注意: ·词法空间· 中的文字和 QName··值空间· 中的值之间的映射要求命名空间声明在使用 QName 的上下文范围内。

XML 1.0 中的命名空间 > 4 限定名称

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

将 QName 解析为模式组件的过程定义为:

XML 模式第 1 部分:结构 > 3.15.3 模式的 XML 表示的约束

架构表示约束:QName 解析(架构文档)

要使·QName· 解析为指定类型的模式组件,以下所有条件都必须为真:

[...]

2 组件的{name} 与·QName· 的·local name· 匹配;

[...]

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

XML 模式第 1 部分:> 3.2.2 属性声明模式组件的 XML 表示

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

XML 模式第 1 部分:> 3.3.2 元素声明模式组件的 XML 表示

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

XML Schema 第 1 部分:> 3.4.2 复杂类型定义的 XML 表示

{name} [属性]的·实际值·name如果存在,否则·不存在·。

总而言之,XSD 中引用其他模式组件的唯一语义是使用它们的名称。

于 2019-01-18T15:50:14.083 回答