Xsd 扩展complexType时是否继承了混合?

Xsd 扩展complexType时是否继承了混合?,xsd,Xsd,我在模式中有以下内容: <xs:element name="td"> <xs:complexType> <xs:complexContent> <xs:extension base="cell.type"/> </xs:complexContent> </xs:complexType> </xs:element> <xs:complexType name="cel

我在模式中有以下内容:

<xs:element name="td">
   <xs:complexType>
     <xs:complexContent>
       <xs:extension base="cell.type"/>
    </xs:complexContent>
  </xs:complexType>
</xs:element>

<xs:complexType name="cell.type" mixed="true">
  <xs:sequence minOccurs="0" maxOccurs="unbounded">
    <xs:element ref="p"/>
  </xs:sequence>
</xs:complexType>

一些解析器允许PCDATA直接在元素中,而其他解析器则不允许。XSD建议(3.4.2)中有一点指出,当一个复杂类型具有复杂内容,并且两个类型都没有混合属性时,有效的混合属性为false。这意味着,如果cell.type的扩展导致mixed=“true”被继承,则混合内容的唯一有效方式就是

是否有更熟悉模式的人可以对正确的解释进行评论


(顺便说一句:如果我控制了模式,我会将mixed=“true”移动到元素定义中,但这不是我的要求。)

任何阅读我的问题的人都可能想阅读thread(通过)。我的答案似乎并不完全正确:解析器/验证器不会以相同的方式处理基/派生元素上的混合属性声明


关于扩展复杂类型,W3C规范第1.4.3.2.2.1小节指出

[派生的和基的]{content type}必须是混合的,或者两者都只能是元素

因此,是的,它是继承的(或者更像是最终无法覆盖相同的内容)

基本上,您所描述的是期望的(就我而言)最符合逻辑的行为

我创建了一个简单的模式,用Eclipse的XML工具运行一个小测试

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="c">
    <xs:complexType>
      <xs:complexContent mixed="false">
        <xs:extension base="a"/>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="a" mixed="true">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="b"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

上述模式是有效的,因为Eclipse和W3C的“官方”XML模式验证器都没有注意到任何问题

以下XML通过了上述模式的验证

<?xml version="1.0" encoding="UTF-8"?>
<c xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test.xsd">
  x
  <b/>
  y
</c>

x
Y
因此,基本上不能覆盖复杂基类型的混合性。为了进一步支持此语句,请尝试交换基本类型和dervied类型的混合性。在这种情况下,XML无法验证,因为派生类型不会混合,因为它(再次)无法覆盖基的混合性

你也说过

一些解析器允许PCDATA直接在元素中,而其他解析器则不允许


弄清楚你说的是哪种解析器并没有什么坏处。一个好的解析器在遇到混合内容时不应该失败。给定正确模式的验证解析器,如果在模式不允许的情况下遇到混合内容,则将失败。

W3C邮件列表中已提出此问题: