- 締切済み
最低1つの要素が存在するグループ (XSD)
次のようなXMLのための定義を考えています。 <root> <aaa /> <bbb /> </root> 1. aaa 要素と bbb 要素は、いずれも minOccurs=0 maxOccurs=1 です。 2. root 要素は、aaa 要素と bbb 要素のいずれか1つまたは両方を持つことができます。 3. root 要素は、必ず子要素を持つ必要があります。(aaa 要素および bbb 要素の両方またはいずれか1つを必ず含む) このような条件の XSD 定義を作成することはできるのでしょうか。 1 と 2 を条件とする定義は次のように作成できたのです。 <xs:complexType> <xs:sequence> <xs:element name="aaa" minOccurs="0"/> <xs:element name="bbb" minOccurs="0"/> </xs:sequence> </xs:complexType> しかし、3 の条件を考慮すると、どのように定義したらよいかわからなくなってしまいました。 このような定義が可能なら、どのようにすればよいのか、ご教示ください。 よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- himajin100000
- ベストアンサー率54% (1660/3060)
試験受けたりしたくせに,XML Schemaはまともに勉強しなかったからさ, 回答のためにいろいろ書いてValidatorに怒られまくったorz。そのため愚痴が続きます。 #いや、試験の時にはXSLTもまともに勉強しなかったんで,ずたずたにされましたが。 #仕様書読むのが面倒くさいからって放置しっぱなしで巣 で,本題。 名前空間接頭辞付きで話をしているけど,こんな感じでいけそう。 とりあえず,ここでスキーマとインスタンス渡す分には成功している感じ。 http://tools.decisionsoft.com/schemaValidate/ <?xml version="1.0" encoding="UTF-8" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sample="http://www.example.com/himajin100000/" targetNamespace="http://www.example.com/himajin100000/" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="root"> <xs:complexType> <xs:choice> <xs:sequence> <xs:element ref="sample:aaa" minOccurs="1" maxOccurs="1" /> <xs:element ref="sample:bbb" minOccurs="0" maxOccurs="1" /> </xs:sequence> <xs:sequence> <xs:element ref="sample:bbb" minOccurs="1" maxOccurs="1" /> <xs:element ref="sample:aaa" minOccurs="0" maxOccurs="1" /> </xs:sequence> </xs:choice> </xs:complexType> </xs:element> <xs:element name="aaa" type="xs:string" /> <xs:element name="bbb" type="xs:string" /> </xs:schema> ======================================== #最初は以下のように書いて怒られてました <?xml version="1.0" encoding="UTF-8" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sample="http://www.example.com/himajin100000/" targetNamespace="http://www.example.com/himajin100000/" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="root"> <xs:complexType> <xs:choice> <xs:element ref="sample:aaa" minOccurs="1" maxOccurs="1" /> <xs:element ref="sample:bbb" minOccurs="1" maxOccurs="1" /> <xs:sequence> <xs:element ref="sample:aaa" minOccurs="1" maxOccurs="1" /> <xs:element ref="sample:bbb" minOccurs="1" maxOccurs="1" /> </xs:sequence> <xs:sequence> <xs:element ref="sample:bbb" minOccurs="1" maxOccurs="1" /> <xs:element ref="sample:aaa" minOccurs="1" maxOccurs="1" /> </xs:sequence> </xs:choice> </xs:complexType> </xs:element> <xs:element name="aaa" type="xs:string" /> <xs:element name="bbb" type="xs:string" /> </xs:schema> たぶん <?xml version="1.0" encoding="UTF-8" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sample="http://www.example.com/himajin100000/" targetNamespace="http://www.example.com/himajin100000/" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="root"> <xs:complexType> <xs:sequence> <xs:choice> <xs:element ref="sample:aaa" minOccurs="1" maxOccurs="1" /> <xs:sequence> <xs:element ref="sample:aaa" minOccurs="1" maxOccurs="1" /> <xs:element ref="sample:bbb" minOccurs="1" maxOccurs="1" /> </xs:sequence> </xs:choice> <xs:element ref="sample:bbb" minOccurs="1" maxOccurs="1" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="aaa" type="xs:string" /> <xs:element name="bbb" type="xs:string" /> </xs:schema> こういうことされると検出されにくいから root > a > bって来たときに候補が二つできてしまうから xs:choiceの中は独立にならないといけない…って項目がどっかにあるんだと思う。面倒くさいから調べないけど。
お礼
あ、そうか! 起こりうるケースごとに Choice を書けばいいんですね。 頭いいですね! ありがとうございます。 解決できました。