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.

xs:redefine は現在 1.1 で非推奨に指定されているため、XML スキーマ 1.1 の xs:override 機能も試しましたが、これを正しく検証することはできず、サポートは非​​常に初期段階にあるようです。

元の基本スキーマを拡張し、拡張を含むインスタンス ドキュメントを基本の非拡張スキーマで検証できるようにするという目標を達成する方法はありますか?

4

1 に答える 1

1

namespace-restriction を緩和すると、<xd:Start>要素をルール<xs:element name="Start"/>として一致させるか、すべてをスキップして<xs:any />ルールとして一致させるかの間にあいまいさが生じます。同じことが他の定義済み要素にも当てはまります。

正規表現では、この場合貪欲な量指定子を使用しますが、XSD 言語では貪欲と怠惰を区別しません。

現状では、それを解決するには2つの方法があります。

  • 2 番目のファイルで別の名前空間を選択します。
  • 最初のファイルで最後に定義された要素を必須にし、繰り返し不可にします: minOccurs="1" maxOccurs="1". たぶん、値を - 要素でラップします<xd:Values>

続きを読む:

于 2012-11-04T00:48:19.080 に答える