我可以在任何地方找到内置数据类型的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,布尔值可以有'true','false','0'或'1'之一。)
但是我找不到内置数据类型的模式规范。
同样,在http://www.w3.org/TR/xmlschema-2上有“数据类型定义的模式”,但对我而言,这种情况并没有真正定义。同样,布尔类型在该模式中定义如下:
<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>
但这仅限于whiteSpace限制。 这同样适用于所有其他数据类型,因此我不理解此模式如何正确定义数据类型。
再次,如果有一个定义内置数据类型的模式,我在哪里可以找到它? ......或者我在这里想念一些东西?
希望我的问题足够明确:)
提前感谢您的帮助!
答案 0 :(得分:0)
简短回答:你可以找到一些近似值,但是你找不到XSD内置类型的规范定义,因为(正如你所怀疑的那样)它们没有使用XSD进行规范定义。
更长的答案:原始数据类型,包括xsd:boolean,构成了类型系统的基础;即使原则上也不可能有任何基本类型的XSD声明。 (术语“原始”只是我们在系统中给出的那些东西的名称,必须在系统之外定义,通常在散文中,而不是在系统内部。)
一般来说,原因很简单:XSD简单类型声明根据现有原语定义新类型 - 因此在它可以处理任何XSD类型定义之前,任何XSD处理器必须已知原语。任何使用XSD定义基元的尝试都会(a)使得如此定义的类型按照定义是派生类型而不是基元,并且(b)导致无限回归。更具体地说:我们可以枚举词法形式'true','false,'1'和'0',如你所示 - 但xsd:enumeration仅被定义为限制某些基数的值空间的方式通过枚举该基本类型的值空间中的选定值来键入(在您的示例中缺少)。但是这些原语不能这样定义;出于正式目的,它们确实具有基本类型(XSD 1.0中的xsd:anySimpleType,XSD 1.1中的xsd:anyAtomicType),但anyAtomicType的值空间被定义(在散文中)作为当前和未来的值空间的并集原始类型。在XSD中无法定义原始类型的值空间的性质以及从词汇空间到值空间的映射的性质;他们必须用散文。 (例如:你的枚举列出了boolean的值;如何定义xsd:anyURI的词法空间?你如何指定'1'和'true'都表示相同的值,并且'0'和'false'表示另一个值?
一些内置类型 - 特别是所有普通(非原始)内置函数 - 原则上可以用XSD语法声明。但是,由于处理器需要具有内置类型的内置知识,因此为它们提供实际的XSD声明不会产生有用的结果:最多,您提供的声明将被忽略为不必要和冗余;处理器也可能选择在它可能看到的尝试为已经声明的类型提供第二个声明时引发错误。 (一个关于内核和标准库的更清晰的故事本可以避免这个问题,但XSD wg并没有在1.0中提供一个干净的故事,并且向后兼容性问题意味着wg无法清除1.1中产生的混乱。)< / p>
在XSD 1.0 schema for schema documents中,您可以找到所有内置函数的XSD声明的近似值;您可能会发现非基元的声明不如基元的声明那么令人满意。由于上述原因,所有这些声明都被移出XSD 1.1中的模式文档的模式,变成两个单独的伪模式文档,一个用于primitive datatypes,另一个用于ordinary built-in datatypes。