1

ゴール:

要素octaveは、サブノードqueryまたは名前空間http://www.website.com/main内の任意のサブノードのいずれかを持つことができます。

これがどこでどのように固有の粒子属性に違反しているかはわかりません...オクターブと呼ばれる他の要素やクエリと呼ばれるサブノードはありません。クエリはグローバル要素ではなく、オクターブのみに使用されます

エラー:

"cos-nonambig: " http://www.website.com/main ":query and WC[" http://www.website.com/main "] (またはそれらの置換グループの要素) は、"Unique Particle Attribution 「。このスキーマに対する検証中に、これらの 2 つの粒子に対してあいまいさが生じます。」

スキーマ:

<?xml version="1.0" encoding="UTF-8"?>

<xs:schema
    xmlns="http://www.website.com/main"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.website.com/main" 
    attributeFormDefault="unqualified" elementFormDefault="qualified"
    >

<xs:complexType name="octave" >
    <xs:choice>
        <xs:element name="query" type="xs:string" />
        <xs:any minOccurs="0" maxOccurs="unbounded" namespace="http://www.website.com/main" processContents="strict" />
    </xs:choice>
    <xs:attribute name="id" type="xs:string" use="optional" />
</xs:complexType>

<xs:element name="octave" type="octave" />

4

2 に答える 2

2

あなたが説明する動作は、次のように「オクターブ」を宣言することで取得できます。

<xs:complexType name="octave" >
  <xs:choice>
    <xs:any minOccurs="0" 
            maxOccurs="unbounded" 
            namespace="http://www.website.com/main" 
            processContents="strict" />
  </xs:choice>
  <xs:attribute name="id" 
                type="xs:string" 
                use="optional" />
</xs:complexType>

クエリをグローバル要素として宣言します。

<xs:element name="query" type="xs:string" />

定義しているクエリ要素は名前空間http://www.website.com/mainにあるため、ワイルドカードによって受け入れられ、「オクターブ」タイプの観点から、それへの要素参照を選択肢に含める差し迫った必要はありません。

この設計には、名前空間内の任意の要素に一致するすべての既存のワイルドカードが「クエリ」にアクセスできるという欠点がありますhttp://www.website.com/main。「クエリ」が要素「オクターブ」および同じタイプの他の要素の子としてのみ表示されることが非常に重要な場合は、ローカルの「クエリ」要素を非修飾にすることを検討してください。

<xs:complexType name="octave" >
  <xs:choice>
    <xs:element name="query" 
                type="xs:string" 
                form="unqualified"/>
    <xs:any minOccurs="0" 
            maxOccurs="unbounded" 
            namespace="http://www.website.com/main" 
            processContents="strict" />
  </xs:choice>
  <xs:attribute name="id" 
                type="xs:string" 
                use="optional" />
</xs:complexType>

'query' の宣言は、展開された名前が 'main' 名前空間にある要素宣言を生成しなくなったため、ワイルドカードと競合しなくなりました。

XSD 1.1 に移行することもできます。XSD 1.1 では、要素の宣言と参照がワイルドカードよりも優先して一致するということで「一意の粒子属性」ルールが緩和され、既存の宣言が合法になります。

于 2013-07-23T01:08:47.900 に答える