这是空元素的定义:
<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:complexContent
替换为xs:simpleContent
时,出现错误消息:
src-ct.2.2:类型的复杂类型定义表示错误 'processingHook'。当带有simpleContent的complexType限制了 具有混合内容和可清空粒子的complexType,则必须 在受限制的孩子中成为
<simpleType>
我是XSD的新手,所以我不理解错误的原因。
Here我发现了元素定义,这些定义允许在simpleContent
内限制complexType
(但不包括空元素):
<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>
那么,为什么它不能与空元素一起使用?
答案 0 :(得分:0)
如果我尝试这种模式:
<?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'的复杂类型定义表示错误。当带有simpleContent的complexType限制具有混合内容和可清空粒子的complexType时,则<simpleType>
的子代中必须有<restriction>
。
和Saxon 9.9中的此错误消息(更简单):
test.xsd#6上简单类型的基本类型不是简单类型
此处的Saxon错误消息可能被过度简化;但让我们看看规则怎么说:
在XML Schema 1.0第1部分的§343中,我们有:
模式表示约束:复杂类型定义表示OK
...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表示可倒空且具有variant =“ mixed”的复杂类型允许使用<p>12.3</p>
之类的内容,因此应将简单内容(CTSC)为xs:decimal
的复杂类型之所以被视为有效限制,是因为CTSC的每个实例也是其所限制的复杂类型的有效实例。但是§2.2本质上是在定义CTSC时,必须定义简单内容的类型。即使您希望允许简单内容为任何字符串,也必须这样说。
我怀疑原因之一是xs:restriction
通常会定义一个或多个约束方面(例如minInclusive
或pattern
),以及约束方面的含义取决于您要限制的简单类型。