0

次のxsdタイプを定義しました。

<xs:complexType name="parentType">
  <xs:sequence>
    <xs:element name="att" type="xs:string" />
  </xs:sequence>
</xs:complexType>

<xs:complexType name="childType">
  <xs:complexContent>
    <xs:extension base="parentType">
      <xs:sequence>
        <xs:element name="att" type="xs:string" default="foo" minOccurs="0" />
      </xs:sequence>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>

ご想像のとおり、デフォルト値'foo'を指定し、その出現範囲を変更することで、型の要素をオーバーライドしたいと思います(Javaで行うように)。

残念ながら、を書くとき<childType />、私は。を持つ要素を持っていると期待されていatt="foo"ますが、私のXMLバリデーターは次The content of element 'childType' is not complete. One of '{att}' is expected.のように言っています:要素定義のオーバーライドが機能しなかったようです。

私は何か見落としてますか?XSDで要素定義をオーバーライドする方法を知っていますか?

4

1 に答える 1

1

「拡張機能」で何をしたか見てみましょう。

XSD図

制限は機能するかもしれませんが、デフォルトを設定した理由に反する可能性があります-これはあなたの期待とは異なる可能性があります(説明についてはSOのこの投稿を参照してください)。

<xs:complexType name="childType"> 
    <xs:complexContent> 
        <xs:restriction base="parentType"> 
            <xs:sequence> 
                <xs:element name="att" type="xs:string" default="foo" /> 
            </xs:sequence> 
        </xs:restriction> 
    </xs:complexContent> 
</xs:complexType>

問題は、制限で要素をオプションにすることはできないということです。デフォルトは引き続き機能します。空の要素であるという違いは、fooと見なされます。

代わりに次のようなものがあるかもしれません:

<xs:complexType name="parentType"> 
    <xs:sequence> 
        <xs:element name="att" type="xs:string" minOccurs="0"/> 
    </xs:sequence> 
</xs:complexType> 
<xs:complexType name="childType"> 
    <xs:complexContent> 
        <xs:restriction base="parentType"> 
            <xs:sequence> 
                <xs:element name="att" type="xs:string" default="foo" /> 
            </xs:sequence> 
        </xs:restriction> 
    </xs:complexContent> 
</xs:complexType>

必要に応じて、デフォルトを親に移動できます。これはすべて、ここで実際に達成しようとしていることによって異なります。要素のデフォルトがどのように機能するか混乱していると思います。あなたはそれが属性に対してどのように機能するかについてもっと期待していたようです。

于 2012-06-08T22:16:02.967 に答える