XSD:将 simpleContent 限制在空元素的 complexType 中
XSD: restrict simpleContent within a complexType for empty element
这里是空元素的定义:
<xs:complexType name="processingHook">
<xs:complexContent>
<xs:restriction base="xs:anyType">
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<xs:element name="callMyApp" type="processingHook" />
和XML-文档:
<callMyApp
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:noNamespaceSchemaLocation='note.xsd'></callMyApp>
验证成功,但是当我用xs:simpleContent
替换xs:complexContent
时,出现错误:
src-ct.2.2: Complex Type Definition Representation Error for type
'processingHook'. When a complexType with simpleContent restricts a
complexType with mixed content and emptiable particle, then there must
be a <simpleType>
among the children of restriction
我是XSD的新手,所以我不明白错误的原因。
Here 我找到了元素定义,它允许在 complexType
中限制 simpleContent
(但不适用于空元素):
<xs:element name="title">
<xs:complexType>
<xs:simpleContent>
<xs:restriction base="tokenWithLangAndNote">
<xs:maxLength value="255"/>
<xs:attribute name="lang" type="xs:language"/>
<xs:attribute name="note" use="prohibited"/>
</xs:restriction>
</xs:simpleContent>
</xs:complexType>
</xs:element>
那么,为什么它不适用于空元素?
如果我尝试这个架构:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="processingHook">
<xs:simpleContent>
<xs:restriction base="xs:anyType">
</xs:restriction>
</xs:simpleContent>
</xs:complexType>
<xs:element name="callMyApp" type="processingHook" />
</xs:schema>
我从 oXygen(可能直接来自 Xerces)收到此错误消息:
类型 'processingHook' 的复杂类型定义表示错误。当一个complexType 和simpleContent 限制一个complexType 混合内容和可空粒子时,那么<restriction>
的children 中必须有一个<simpleType>
。
以及来自 Saxon 9.9 的这条(更简单的)错误消息:
test.xsd#6处的简单类型的基类型不是简单类型
这里的撒克逊错误信息可能是over-simplified;但让我们看看规则是怎么说的:
在 XML Schema 1.0 第 1 部分的 §343 中,我们有:
模式表示约束:复杂类型定义表示正常
...all of the following must be true:
2 If the <simpleContent> alternative is chosen, all of the following must be true:
2.1 The type definition ·resolved· to by the ·actual value· of the base
[attribute] must be one of the following:
2.1.1 ...
2.1.2 only if the <restriction> alternative is also chosen, a
complex type definition whose {content type} is mixed and a particle
which is ·emptiable·, as defined in Particle Emptiable (§3.9.6);
2.1.3 ...
2.2 If clause 2.1.2 above is satisfied, then there must be a
<simpleType> among the [children] of <restriction>.
因此,Xerces 错误消息(通常是这种情况)相当直接地从规范中提取出来,并引用包含相关规则的条款编号 (§2.2)。
§2.1.2 是说复杂类型是空的并且有 variety="mixed" 允许像 <p>12.3</p>
这样的东西,因此具有简单内容(CTSC)的复杂类型 xs:decimal
应被视为有效限制,因为 CTSC 的每个实例也是它所限制的复杂类型的有效实例。但是 §2.2 本质上是说当你定义一个 CTSC 时,你必须定义简单内容的类型是什么。就算你想让简单的内容是任意字符串,你也得这么说。
我怀疑其中一个原因是 xs:restriction
通常会定义一个或多个约束面(例如 minInclusive
或 pattern
),而 xs:restriction
的含义约束方面取决于您要限制的简单类型。
这里是空元素的定义:
<xs:complexType name="processingHook">
<xs:complexContent>
<xs:restriction base="xs:anyType">
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<xs:element name="callMyApp" type="processingHook" />
和XML-文档:
<callMyApp
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:noNamespaceSchemaLocation='note.xsd'></callMyApp>
验证成功,但是当我用xs:simpleContent
替换xs:complexContent
时,出现错误:
src-ct.2.2: Complex Type Definition Representation Error for type 'processingHook'. When a complexType with simpleContent restricts a complexType with mixed content and emptiable particle, then there must be a
<simpleType>
among the children of restriction
我是XSD的新手,所以我不明白错误的原因。
Here 我找到了元素定义,它允许在 complexType
中限制 simpleContent
(但不适用于空元素):
<xs:element name="title">
<xs:complexType>
<xs:simpleContent>
<xs:restriction base="tokenWithLangAndNote">
<xs:maxLength value="255"/>
<xs:attribute name="lang" type="xs:language"/>
<xs:attribute name="note" use="prohibited"/>
</xs:restriction>
</xs:simpleContent>
</xs:complexType>
</xs:element>
那么,为什么它不适用于空元素?
如果我尝试这个架构:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="processingHook">
<xs:simpleContent>
<xs:restriction base="xs:anyType">
</xs:restriction>
</xs:simpleContent>
</xs:complexType>
<xs:element name="callMyApp" type="processingHook" />
</xs:schema>
我从 oXygen(可能直接来自 Xerces)收到此错误消息:
类型 'processingHook' 的复杂类型定义表示错误。当一个complexType 和simpleContent 限制一个complexType 混合内容和可空粒子时,那么<restriction>
的children 中必须有一个<simpleType>
。
以及来自 Saxon 9.9 的这条(更简单的)错误消息:
test.xsd#6处的简单类型的基类型不是简单类型
这里的撒克逊错误信息可能是over-simplified;但让我们看看规则是怎么说的:
在 XML Schema 1.0 第 1 部分的 §343 中,我们有:
模式表示约束:复杂类型定义表示正常
...all of the following must be true:
2 If the <simpleContent> alternative is chosen, all of the following must be true:
2.1 The type definition ·resolved· to by the ·actual value· of the base
[attribute] must be one of the following:
2.1.1 ...
2.1.2 only if the <restriction> alternative is also chosen, a
complex type definition whose {content type} is mixed and a particle
which is ·emptiable·, as defined in Particle Emptiable (§3.9.6);
2.1.3 ...
2.2 If clause 2.1.2 above is satisfied, then there must be a
<simpleType> among the [children] of <restriction>.
因此,Xerces 错误消息(通常是这种情况)相当直接地从规范中提取出来,并引用包含相关规则的条款编号 (§2.2)。
§2.1.2 是说复杂类型是空的并且有 variety="mixed" 允许像 <p>12.3</p>
这样的东西,因此具有简单内容(CTSC)的复杂类型 xs:decimal
应被视为有效限制,因为 CTSC 的每个实例也是它所限制的复杂类型的有效实例。但是 §2.2 本质上是说当你定义一个 CTSC 时,你必须定义简单内容的类型是什么。就算你想让简单的内容是任意字符串,你也得这么说。
我怀疑其中一个原因是 xs:restriction
通常会定义一个或多个约束面(例如 minInclusive
或 pattern
),而 xs:restriction
的含义约束方面取决于您要限制的简单类型。