【问题标题】:Extending existing XSD and allow backward validation扩展现有 XSD 并允许向后验证
【发布时间】:2012-11-03 00:20:08
【问题描述】:

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

有什么方法可以实现扩展原始基础架构并允许包含扩展的实例文档使用基础非扩展架构进行验证的目标?

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

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

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

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

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

    了解更多:

    【讨论】:

    • 谢谢马库斯。另一个命名空间不能与我知道的“重新定义”一起使用,也使用“导入”或“包含”意味着无法扩展现有模式类型。不幸的是,我不能使用第二个想法,即使最后定义的元素成为必需且不可重复的,因为这涉及许多元素,并且许多元素必然只包含可选元素。
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 2021-09-02
    • 2014-02-14
    • 2018-04-02
    • 2014-05-26
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多