我可以通过XSD类型的ID引用它吗



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>

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

如果id属性

id属性便于在URI:中使用短格式或短手XPointer作为片段标识符

XML架构第1部分:结构>3.15.2.2其他对模式组件的引用

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

[…]

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

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

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

因此,片段的格式和分辨率取决于可能检索到的表示,即使只有当URI已取消引用。

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

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表示[XML1.0(第二版)]中的ID属性类型。ID的·值空间·是与[XML中的命名空间]中的NCName生成相匹配的所有字符串的集合。ID的·词法空间·是与[XML中的命名空间]中的NCName生成相匹配的所有字符串的集合。ID的基本类型为NCName。

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

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

通过id引用其他模式组件

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

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

<element

[…]

ref = QName
substitutionGroup = QName
type = QName

QName在XML模式中定义如下:

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架构第1部分:>3.4.2复杂类型定义的XML表示

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

总之,XSD中引用其他架构组件的唯一语义是使用它们的名称。

最新更新