目标是创建一个扩展现有 XML 模式的 XML 模式,以便可以使用基本 XSD 或扩展 XSD 验证生成的实例文档。
这是一个基本 XSD 示例:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:dx="dataxsd/1"
targetNamespace="dataxsd/1"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:complexType name="DataType">
<xs:sequence>
<xs:element name="Start" type="xs:dateTime" minOccurs="0"/>
<xs:element name="End" type="xs:dateTime" minOccurs="0"/>
<xs:element name="Value" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="type" type="xs:integer"/>
<xs:anyAttribute namespace="##other" processContents="lax"/>
</xs:complexType>
<xs:element name="Data" type="dx:DataType"></xs:element>
</xs:schema>
我想扩展它来做一个超集。我最初的方法是使用类似于以下的 xs:redefine 功能:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:dx="dataxsd/1"
targetNamespace="dataxsd/1"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:redefine schemaLocation="data.xsd">
<xs:complexType name="DataType">
<xs:complexContent>
<xs:extension base="dx:DataType">
<xs:sequence>
<xs:element name="Status" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:redefine>
</xs:schema>
使用 oXygen 14.1,这两种模式都可以成功验证。
由于 xs:any 命名空间仅允许“##other”,因此包含扩展架构的实例文档将不会针对非扩展架构进行验证,xs:redefine 要求扩展位于同一命名空间中。
更改基本架构是不可取的,但我尝试更改它以将 xs:any 命名空间限制设置为“##any”,XSD 本身不会验证,Xerces 投诉是:
cos-nonambig: "dataxsd/1":Start and WC[##any] (or elements from their substitution group) violate "Unique Particle Attribution". During validation against this schema, ambiguity would be created for those two particles.
我还尝试了 XML Schema 1.1 xs:override 功能,因为 xs:redefine 现在在 1.1 中被指定为弃用,但我永远无法正确验证它,而且支持似乎处于非常早期的阶段。
有没有办法实现扩展原始基本模式并允许包含扩展的实例文档使用基本非扩展模式进行验证的目标?