2

目标是创建一个扩展现有 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 中被指定为弃用,但我永远无法正确验证它,而且支持似乎处于非常早期的阶段。

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

4

1 回答 1

1

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

在 Regex 中,在这种情况下您将使用贪婪量词,但 XSD 语言不区分greedy 和 lazy

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

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

阅读更多:

于 2012-11-04T00:48:19.080 回答