1

我可以在任何地方找到内置数据类型的 xsd 定义,还是它们不是使用 xsd 定义的?

例如,我猜想 xs:boolean 数据类型将被定义为:

<xs:simpleType name="boolean">
    <xs:restriction>
      <xs:pattern value="true|false|0|1"/>
    </xs:restriction>
</xs:simpleType>

(由于根据规范http://www.w3.org/TR/xmlschema-2/#boolean,布尔值可以具有值“真”、“假”、“0”或“1”之一。)

但我找不到内置数据类型的架构规范。

同样,在http://www.w3.org/TR/xmlschema-2上有“数据类型定义的模式”,但对我来说,这个 scema 并没有真正定义太多。同样,布尔类型在该模式中定义如下:

<xs:simpleType name="boolean" id="boolean">
    <xs:annotation>
      <xs:appinfo>
        <hfp:hasFacet name="pattern"/>
        <hfp:hasFacet name="whiteSpace"/>
        <hfp:hasProperty name="ordered" value="false"/>
        <hfp:hasProperty name="bounded" value="false"/>
        <hfp:hasProperty name="cardinality" value="finite"/>
        <hfp:hasProperty name="numeric" value="false"/>
      </xs:appinfo>
      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#boolean"/>
    </xs:annotation>
    <xs:restriction base="xs:anySimpleType">
      <xs:whiteSpace fixed="true" value="collapse" id="boolean.whiteSpace"/>
    </xs:restriction>
  </xs:simpleType>

但这仅给出了空白限制。这同样适用于所有其他数据类型,所以我不明白这个模式如何正确定义数据类型。

再说一次,如果有一个定义内置数据类型的模式,我在哪里可以找到它?...或者我在这里误解了什么?

希望我的问题足够清楚:)

提前感谢您的帮助!

4

1 回答 1

1

简短回答:您可以找到一些近似值,但找不到 XSD 内置类型的规范定义,因为(正如您所怀疑的)它们不是使用 XSD 规范定义的。

更长的答案:包括 xsd:boolean 在内的原始数据类型构成了类型系统的基础;即使在原则上也不可能有任何原始类型的 XSD 声明。(术语“原始”只是我们给系统中那些必须在系统之外定义的事物的名称,通常是散文,而不是系统内部。)

一般而言,原因很简单:XSD 简单类型声明根据现有原语定义新类型——因此任何 XSD 处理器必须已经知道这些原语,然后才能处理任何 XSD 类型定义。任何使用 XSD 定义原语的尝试都会 (a) 根据定义,使如此定义的类型成为派生类型而不是原语,并且 (b) 导致无限倒退。更具体地说:我们可以枚举词汇形式“真”、“假”、“1”和“0”,正如你所展示的——但 xsd:enumeration 仅被定义为限制某些基数的值空间的一种方式通过枚举该基本类型的值空间中的选定值来键入(在您的示例中缺失)。但是不能这样定义原语;出于正式目的,它们确实有一个基本类型(xsd:XSD 1.0 中的 anySimpleType,XSD 1.1 中的 xsd:anyAtomicType),但是 anyAtomicType 的值空间被定义为(在散文中)作为所有当前和未来原始类型的值空间的联合。原始类型的值空间的性质以及从词法空间到值空间的映射的性质不能在 XSD 中定义;它们必须以散文形式给出。(例如:您的枚举列出了布尔值;如何定义 xsd:anyURI 的词法空间?您将如何指定 '1' 和 'true' 都表示相同的值,而 '0' 和'false' 表示其他值?值空间和从词法空间到值空间的映射的性质不能在 XSD 中定义;它们必须以散文形式给出。(例如:您的枚举列出了布尔值;如何定义 xsd:anyURI 的词法空间?您将如何指定 '1' 和 'true' 都表示相同的值,而 '0' 和'false' 表示其他值?值空间和从词法空间到值空间的映射的性质不能在 XSD 中定义;它们必须以散文形式给出。(例如:您的枚举列出了布尔值;如何定义 xsd:anyURI 的词法空间?您将如何指定 '1' 和 'true' 都表示相同的值,而 '0' 和'false' 表示其他值?

一些内置类型——特别是所有普通(非原始)内置类型——原则上可以用 XSD 语法声明。但是由于处理器需要具有内置类型的内置知识,因此为它们提供实际的 XSD 声明不会产生有用的结果:充其量您提供的声明将被忽略为不必要和多余的;处理器也可能会选择引发错误,因为它可能会认为试图为已声明的类型提供第二个声明。(关于内核和标准库的更简洁的故事可以避免这个问题,但是 XSD wg 在 1.0 中没有提供清晰的故事,并且向后兼容性问题意味着 wg 在 1.1 中无法清理由此产生的混乱。)

在模式文档的 XSD 1.0模式中,您会发现所有内置函数的 XSD 声明的近似值;您可能会发现非基元的声明不如基元的声明那么不令人满意。由于上述原因,在 XSD 1.1 中,所有这些声明都从模式文档的模式中移出,变成了两个单独的伪模式文档,一个用于原始数据类型,一个用于普通内置数据类型

于 2013-07-26T23:31:42.710 回答