扩展现有XSD并允许向后验证

时间:2012-11-03 00:20:09

标签: xml xsd

目标是创建一个扩展现有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:任何命名空间限制设置为XSD本身无法验证的“## any”,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:覆盖功能,因为xs:redefine现在在1.1中已被弃用,但我永远无法正确验证它并且支持似乎处于非常早期阶段。

有没有办法实现扩展原始基础架构并允许包含扩展的实例文档使用基本的非扩展架构进行验证的目标?

1 个答案:

答案 0 :(得分:1)

放宽命名空间限制会在将<xd:Start>元素作为<xs:element name="Start"/> - 规则进行匹配或将其全部跳过并将其作为<xs:any />规则进行匹配之间产生歧义。其他预定义元素也是如此。

在Regex中,在这种情况下你会使用贪婪的量词,但是XSD语言没有区分greedy and lazy

目前,有两种方法可以解决它:

  • 在第二个文件中选择另一个命名空间。
  • 在第一个文件中创建最后定义的元素,并且不可重复:minOccurs="1" maxOccurs="1"。也许将值包装在<xd:Values> - 元素中。

了解详情:

相关问题