简而言之,我的疑问是:在W3C XML Schema中扩展混合元素类型,我们是否必须声明
mixed="true
扩展元素显式?或者这是否从扩展元素类型混合的事实中隐式地衍生出来?
我能够创建的最简单的示例如下。
给定以下 XML 架构“foo.xsd”文件
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="mixedElement" mixed="true">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="elem"/>
</xs:choice>
</xs:complexType>
<xs:element name="root">
<xs:complexType>
<xs:complexContent>
<xs:extension base="mixedElement"/>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:schema>
其中
root
元素扩展了复杂类型 mixedElement
(显式地 mixed="true"
)但没有 mixed="true"
,并给出以下 XML“foo.xml”简单文件
<?xml version="1.0" encoding="utf-8"?>
<root
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="foo.xsd">abc<elem/>xyz</root>
其中
root
元素的含量混合,我们根据xmllint
得到
xmllint --noout --schema foo.xsd foo.xml
“foo.xml”是有效的,但根据 XML 模式验证器(python 库)它不是,因为
File "/usr/lib/python3/dist-packages/xmlschema/validators/schemas.py", line 1678, in validate
raise error
xmlschema.validators.exceptions.XMLSchemaValidationError: failed validating <Element 'root' at 0x7f3592775260> with XsdGroup(model='sequence', occurs=[1, 1]):
Reason: character data between child elements not allowed
如果我将
mixed="true"
添加到 root
元素,“foo.xml”根据两个验证器都是有效的
<xs:element name="root" mixed="true"> <!-- added mixed="true" -->
所以问题是:根据 W3C XML Schema 建议,谁是对的?
xmllint
,也就是说“foo.xml”是有效的?
或者 python 的 XML Schema Validator 库,说它不是?
阅读规范:XML Schema 1.0 第 1 部分第 3.4.6 小节
Schema Component Constraint: Derivation Valid (Extension)
,规则 1.4.3.2.2.1 说:两个 {content type} 必须混合或两者都必须是纯元素。
这表明该架构无效。
但是,Saxon-EE(我的模式处理器)接受它,并且 Saxon-EE 通过了所有一致性测试,这表明我错过了一些东西。
现在,如果我将派生类型更改为
mixed="false"
,撒克逊人仍然接受它,这似乎与刚刚引用的规则 1.4.3.2.2.1 直接矛盾。这强烈地表明 (a) Saxon 弄错了,(b) W3C 测试套件中没有对此进行测试。
我在规范中没有看到任何内容表明派生类型从基类型继承属性。
顺便说一句,XSD 1.1 纠正了 XSD 1.0 中的遗漏,明确表示如果
complexType
及其 complexContent
子级都具有 mixed
属性,则它们必须一致。