当扩展复杂类型时混合继承吗?

2024-01-07

我的架构中有以下内容:

<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 的扩展导致 mix="true" 被继承。

更熟悉模式的人可以评论正确的解释吗?

(顺便说一句:如果我可以控制模式,我会将 mix="true" 移至元素定义,但这不是我的决定。)


任何阅读我的问题的人可能想阅读this http://lists.w3.org/Archives/Public/xmlschema-dev/2005Sep/0018.html线程也(通过Damien https://stackoverflow.com/users/438970/damien)。看来我的答案并不完全正确:解析器/验证器不处理mixed基/派生元素上的属性声明也以相同的方式进行。


关于扩展复杂类型,第 1.4.3.2.2.1 节第3.4.6节 http://www.w3.org/TR/xmlschema-1/#cos-ct in part 1 http://www.w3.org/TR/xmlschema-1W3C 的XML模式 http://www.w3.org/TR/xmlschema-1规范说

Both [衍生和基础]{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>

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

你也说过

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

澄清你正在谈论哪些解析器并没有什么坏处。 Agood解析器在遇到混合内容时不应失败。给定正确的模式,验证解析器如果在模式不允许的情况下遇到混合内容,将会失败。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当扩展复杂类型时混合继承吗? 的相关文章

随机推荐