具有混合元素扩展的 XML 模式

问题描述 投票:0回答:1

简而言之,我的疑问是:在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 xsd language-lawyer xsd-validation xmllint
1个回答
0
投票

阅读规范: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
属性,则它们必须一致。

© www.soinside.com 2019 - 2024. All rights reserved.