XSD:将complexType内的simpleContent限制为空元素

时间:2019-05-04 00:55:49

标签: xml xsd xsd-validation

这是空元素的定义:

<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>

那么,为什么它不能与空元素一起使用?

1 个答案:

答案 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通常会定义一个或多个约束方面(例如minInclusivepattern),以及约束方面的含义取决于您要限制的简单类型。