4

要素の属性の一意性を強制する必要がありますが、親要素の範囲内でのみです。有効な XML の例を次に示します。

<ns:Root
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ns="urn:Test.Namespace"  
    xsi:schemaLocation="urn:Test.Namespace Test1.xsd"
    >
    <ns:element1 id="001">
        <ns:element2 id="001.1" order="1">
            <ns:element3 id="001.1.1" />
        </ns:element2>
        <ns:element2 id="001.2" order="2">
            <ns:element3 id="001.1.2" />
        </ns:element2>        
    </ns:element1>
    <ns:element1 id="002">
       <ns:element2 id="002.1" order="1">
           <ns:element3 id="002.1.1" />
        </ns:element2>
        <ns:element2 id="002.2" order="2">
            <ns:element3 id="002.1.2" />
        </ns:element2>        
    </ns:element1>    
</ns:Root>

上記のように、「element1」には 2 つのセットがあり、その中で element2 ノードには「order」という属性があることに注意してください。要件は、'order' が親の 'element1' 内で一意である必要があることです。たとえば、この単純化されたバージョンは無効な XML になります。

<ns:Root
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ns="urn:Test.Namespace"  
    xsi:schemaLocation="urn:Test.Namespace Test1.xsd"
    >
    <ns:element1 id="001">
        <ns:element2 id="001.1" order="1">
            <ns:element3 id="001.1.1" />
        </ns:element2>
        <ns:element2 id="001.2" order="1">
            <ns:element3 id="001.1.2" />
        </ns:element2>        
    </ns:element1>    
</ns:Root>

これを行うために、次のスキーマを作成しました。

<?xml version="1.0"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="urn:Test.Namespace"
            xmlns:ns="urn:Test.Namespace"
            elementFormDefault="qualified">
    <xsd:element name="Root">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="element1" maxOccurs="unbounded" type="ns:element1Type"/>
            </xsd:sequence>
        </xsd:complexType>
        <xsd:unique name="uniqueElement2OrderInElement1">
            <xsd:selector xpath="./ns:element1" />
            <xsd:field xpath="ns:element2/@order" />
        </xsd:unique>        
    </xsd:element>

    <xsd:complexType name="element1Type">
        <xsd:sequence>
            <xsd:element name="element2" maxOccurs="unbounded" type="ns:element2Type"/>
        </xsd:sequence>
        <xsd:attribute name="id" type="xsd:string"/>
    </xsd:complexType>

    <xsd:complexType name="element2Type">
        <xsd:sequence>
            <xsd:element name="element3" type="ns:element3Type" />
        </xsd:sequence>
        <xsd:attribute name="id" type="xsd:string" />
        <xsd:attribute name="order" type="xsd:string" />
    </xsd:complexType>

    <xsd:complexType name="element3Type">
        <xsd:attribute name="id" type="xsd:string"/>
    </xsd:complexType>        
</xsd:schema>

これは、一意性を強制するという点で近いですが、ドキュメント全体です。つまり、すべての注文属性は一意でなければなりません。これは、ルートのスキーマに配置されているためだと思いますが、よりローカライズされた場所に移動するか、セレクターをより具体的にしようとしましたが、機能しません (エラーが発生します)。

私がやろうとしていることは可能ですか?

期待に感謝します

4

1 に答える 1

4

xsd:unique 制約は、配置する要素に応じてスコープが設定されていることがわかる限り、それを移動することで正しい軌道に乗っていました。したがって、特定の要素内で何かを一意にしたい場合は、それを配置します1 element1 xsd:element ブロック。

私はあなたの例を試しました(確かに名前空間を取り除いた後)、 xsd:unique ブロックを移動して xpaths を以下のように更新すると、うまくいくはずです。

<xsd:element name="Root">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="element1" maxOccurs="unbounded" type="ns:element1Type">
                <xsd:unique name="uniqueElement2OrderInElement1">
                    <xsd:selector xpath="./ns:element2" />
                    <xsd:field xpath="@order" />
                </xsd:unique> 
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>               
</xsd:element>
于 2013-03-27T17:23:14.463 に答える