2011-01-26 6 views
1

私はあなたが属性に応じて選択肢を作る最も簡潔な方法は何ですか?

<a type="b"> 
    <b></b> 
</a> 

または

<a type="c"> 
    <c></c> 
</a> 

または

<a type="d"> 
    <d></d> 
</a> 

を持つことができ、いくつかのXMLを持っていますが、以下は有効ではありません。

<a type="c"> 
    <b></b> 
</a> 

私がしようとしていますを作成するこれを表すXMLスキーマですが、正しく理解すると、次のコードではtype属性がタグの内容に正しく関連付けられません。

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

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="a" type="A" minOccurs="1" maxOccurs="1" /> 

    <xs:complexType name="A"> 
     <xs:attribute name="type" type="AType" use="required" /> 
     <xs:choice> 
      <xs:group ref="B" /> 
      <xs:group ref="C" /> 
      <xs:group ref="D" /> 
     </xs:choice> 
    </xs:complexType> 

    <xs:simpleType name="AType"> 
     <restriction base="xs:string"> 
      <enumeration value="b"/> 
      <enumeration value="c"/> 
      <enumeration value="d"/> 
     </restriction> 
    </xs:simpleType> 

    <xs:complexType name="B"> 
     STUFF 
    </xs:complexType> 

    <xs:complexType name="C"> 
     OTHER STUFF 
    </xs:complexType> 

    <xs:complexType name="D"> 
     YET MORE STUFF 
    </xs:complexType> 
</xs:schema> 

のような非常に冗長であることを正しくこれを行うための唯一の方法です:

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

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="a" type="A" minOccurs="1" maxOccurs="1" /> 

    <xs:complexType name="A"> 
     <xs:choice> 
      <xs:group ref="B" /> 
      <xs:group ref="C" /> 
      <xs:group ref="D" /> 
     </xs:choice> 
    </xs:complexType> 

    <xs:complexType name="B"> 
     <xs:attribute name="type" type="xs:string" fixed="b" /> 
     STUFF 
    </xs:complexType> 

    <xs:complexType name="C"> 
     <xs:attribute name="type" type="xs:string" fixed="c" /> 
     OTHER STUFF 
    </xs:complexType> 

    <xs:complexType name="D"> 
     <xs:attribute name="type" type="xs:string" fixed="d" /> 
     YET MORE STUFF 
    </xs:complexType> 
</xs:schema> 
+0

あなたはXMLを使用しており、冗長について不平を言っていますか? (zing!SCNR)さて、真剣に:A/B/Cタグのグループに異なる親タグを使ってみましたか?これを属性に基づいて設定することは、あまりにも一般的な(または賢明な)ものではないようです... – delnan

+0

@delnan私の設計ではない、私はそれのためのスキーマを書いています。実際には、タグ名は異ならず、期待される属性は変わりません。 –

+0

XSDは実際には、任意のXML文書設計を記述できることに基づいて設計されたものではなく、文書*の設計方法に関する独自の前提があります。 –

答えて

2

XSD 1.0でこれを行うには直接的な方法はありません。 XSD 1.1では、「条件付き型の割り当て」の新機能を使用して簡単に行うことができます。この機能は、SaxonとXercesに付属しているスキーマプロセッサの最新リリースでサポートされています。

関連する問題