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