重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

次のような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 の条件を考慮すると、どのように定義したらよいかわからなくなってしまいました。
このような定義が可能なら、どのようにすればよいのか、ご教示ください。
よろしくお願いします。

A 回答 (1件)

試験受けたりしたくせに,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の中は独立にならないといけない…って項目がどっかにあるんだと思う。面倒くさいから調べないけど。
    • good
    • 0
この回答へのお礼

あ、そうか!
起こりうるケースごとに Choice を書けばいいんですね。
頭いいですね!

ありがとうございます。
解決できました。

お礼日時:2009/08/03 14:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!