2

次のような任意の要素を持つことができる XML があります。

<AnyElements>
  <Any1 id="any1" />
  <Any2 id="any2" />
  ...
</AnyElements>

ただし、id属性は必須です。

そのような xsd を定義するにはどうすればよいですか?

<xs:element name="AnyElements" type="AnyRootType" />
<xs:complexType name="AnyRootType">
  <xs:sequence>
    <xs:any type="AnyChildType" minOccurs="1" maxOccurs="unbounded"/>
  </xs:sequence>
</xs:complexType> 

<xs:complexType name="AnyChildType">
  <xs:attribute ref="id" use="required"/>
</xs:complexType>

<xs:attribute name="id" type="xs:string"/>
4

1 に答える 1

0

それはすべて、処理モデルをどのように定義するかによって異なります。ここでは、最初に考慮する必要があるいくつかの事項を示します。

パーティクルはanyタイプで拘束できません。processContentsこれには、 skiplax、およびデフォルトのstrictという名前の属性が付属しています。それが何を意味するのかを正確に理解したら、スキップを使用することは、必須属性を強制できないことを意味します-プロセッサはそれを「スキップ」します。laxを設定すると、コンテンツを記述した XSD が実際に利用可能な場合にのみ処理され、そうでない場合はスキップされます。3 番目のオプションstrictでは、この追加のコンテンツを記述した XSD が利用可能である必要があります - ピリオド。

そのため、検証中に「any」を記述する XSD が使用可能な場合にのみ、anyパーティクルを機能させることができます。私が念頭に置いているオプションは一種の制限ですが、特定の基本型から派生したり、いくつかの属性を参照したりする必要がないという点で、任意の「精神」に最も近いという利点があります。このため、次のような重要な制約が要件を近似します。

    <xsd:key name="ofid">
        <xsd:selector xpath="*"/>
        <xsd:field xpath="@id"/>
    </xsd:key>

実際には、キーによって属性が必須になります。欠点は、各値も一意でなければならないことです。おそらく、という名前の属性を使用するとid、それが期待されます。代わりに、パターンを などに適用したい場合は、age機能しません。

実行時に XSD を使用できるようにすることが許容されると判断した場合は、抽象要素または抽象型の要素を使用することもできます。良いことは、値の一意性制約を配置せずに、より統制のとれたアプローチをもたらすことです (最初から制約を明確に設定します)。欠点は、「コントラクト」(必須属性)を記述する別の XSD への結合が作成されることです。

更新:あなたのコメントによると、以下は置換グループに基づく代替手段です。古い XSD コンポーネント名をできる限り保持するようにしました。

Contract.xsd : これには、契約のコンポーネントが含まれています。これは基本的に、置換グループの先頭を表します。id 属性が必要であることを示します。

<?xml version="1.0" encoding="utf-8" ?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:complexType name="AnyChildType" abstract="true">
        <xsd:attribute name="id" use="required"/>
    </xsd:complexType>

    <xsd:element name="AnyElement" abstract="true" type="AnyChildType"/>
</xsd:schema>

GenericInstance.xsd : 「汎用」ドキュメントのルートを記述します。定義されたルート要素のコンテキストでコントラクトを「統合」します。

<?xml version="1.0" encoding="utf-8" ?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:include schemaLocation="Contract.xsd"/>

    <xsd:element name="AnyElements" type="AnyRootType"/>
    <xsd:complexType name="AnyRootType">
        <xsd:sequence>
            <xsd:element ref="AnyElement" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

SpecificInstance1.xsd : 特定のコントラクト。

<?xml version="1.0" encoding="utf-8" ?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:include schemaLocation="Contract.xsd"/>

    <xsd:element name="SomeElement1" substitutionGroup="AnyElement">
        <xsd:complexType>
            <xsd:complexContent>
                <xsd:extension base="AnyChildType">
                    <xsd:annotation>
                        <xsd:documentation>Any content goes.</xsd:documentation>
                    </xsd:annotation>
                </xsd:extension>
            </xsd:complexContent>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

SpecificInstance2.xsd : 別のコントラクト (異なるオーサリング スタイルを示します)。

<?xml version="1.0" encoding="utf-8" ?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:include schemaLocation="Contract.xsd"/>

    <xsd:element name="SomeElement2" substitutionGroup="AnyElement" type="SomeElement2Type"/>
    <xsd:complexType name="SomeElement2Type">
        <xsd:complexContent>
            <xsd:extension base="AnyChildType">
                <xsd:annotation>
                    <xsd:documentation>Any content goes.</xsd:documentation>
                </xsd:annotation>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
</xsd:schema>

視覚的には、これがそれらがどのように結び付けられているかです。XSD 間の結合が最小限に保たれていることがわかります。

ここに画像の説明を入力

汎用インスタンスおよび特定のインスタンスによって定義されたスコープで有効なサンプル XML。

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<AnyElements xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <SomeElement1 id="1"/>
    <SomeElement2 id="1"/>
</AnyElements>

1 つの XSD のみを使用して XML を検証することに制限されている場合は、そのための XSD を以下に示します。

<?xml version="1.0" encoding="utf-8" ?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:include schemaLocation="GenericInstance.xsd"/>
    <xsd:include schemaLocation="SpecificInstance1.xsd"/>
    <xsd:include schemaLocation="SpecificInstance2.xsd"/>
</xsd:schema>

.NET で実行されている XSD 1.0 で上記をテストしました。XSD 1.1 や他の XSD プロセッサの特定の機能で実行できる機能があれば、私が言ったことの一部が無効になります。

于 2012-10-01T16:29:29.403 に答える