- 締切済み
最低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 の条件を考慮すると、どのように定義したらよいかわからなくなってしまいました。 このような定義が可能なら、どのようにすればよいのか、ご教示ください。 よろしくお願いします。
- doglovedog
- お礼率33% (1/3)
- XML
- 回答数1
- ありがとう数10
- みんなの回答 (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の中は独立にならないといけない…って項目がどっかにあるんだと思う。面倒くさいから調べないけど。
関連するQ&A
- complexTypeは入れ子にできない?
次のようなXML文書を実現する為のXML Schemaを伺っても宜しいでしょうか。 <Test> <A>0</A> <!-- 唯一の要素--> <B>0</B> <!-- 反復要素 --> <C>0</C> <B>0</B> <C>0</C> : : </Test> で、下記のようなXML Schemaを書きましたが、文法エラーになります。 <xsd:element name="Test"><xsd:complexType><xsd:sequence> <!-- 唯一の要素 --> <xsd:element name="A" type="Int"/> <!-- 反復要素 --> <xsd:complexType><xsd:sequence> <xsd:element name="B" type="Int"/> <xsd:element name="C" type="Int"/> </xsd:sequence></xsd:complexType> </xsd:sequence></xsd:complexType></xsd:element> この解決方法をお教え頂けないでしょうか?どうか宜しくお願い致します。
- ベストアンサー
- XML
- XMLスキーマのrefの使い方
こんにちは。yukimura1024です。 以下のXMLスキーマなんですが「Aの下にBを置ける」という意味でrefを使っています。 しかしこの書き方では「ルート要素としてAもBも使える」という意味でも解釈されてしまいます。 これをrefを使いつつ「Aの下にBを置ける」けど「ルート要素はAのみ」とするにはどう書けばいいでしょうか? <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="A"> <xs:complexType> <xs:sequence> <xs:element ref="B"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="B"> <xs:complexType> <xs:sequence> <xs:element name="C" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> アドバイスいただける方いましたらお願いします。
- 締切済み
- XML
- さきほどの質問に関連して(CSVとスキーマの関連付け)
以下の様なコードを書いています。 --------------------------------------------------------- <xsd:element name="DEN_LIST" type="ListType" /> <xsd:complexType name="ListType"> <xsd:complexContent> <xsd:restriction base="xsd:anyType"> <xsd:sequence> <xsd:element ref="DEN" maxOccurs="unbounded"/> </xsd:sequence> </xsd:restriction> </xsd:complexContent> </xsd:complexType> <xsd:element name="DEN" type="DenpyoType"> <xsd:key name="DEN-num1"> <xsd:selector xpath="DEN" /> <xsd:field xpath="num1" /> </xsd:key> </xsd:element> <xsd:complexType name="DenpyoType"> <xsd:complexContent> <xsd:restriction base="xsd:anyType"> <xsd:sequence> <xsd:element ref="num1" /> <xsd:element ref="NAME" /> <xsd:element ref="DRCR" maxOccurs="unbounded" /> </xsd:sequence> </xsd:restriction> </xsd:complexContent> </xsd:complexType> <xsd:element name="num1" type="xsd:string" /> <xsd:element name="NAME" type="xsd:string" /> <xsd:element name="DRCR" type="DCType"> <xsd:key name="DRCR-num2"> <xsd:selector xpath="DRCR" /> <xsd:field xpath="@num2" /> </xsd:key> </xsd:element> <xsd:complexType name="DCType"> <xsd:complexContent> <xsd:restriction base="xsd:anyType"> <xsd:sequence> <xsd:element ref="DR" /> <xsd:element ref="CR" /> </xsd:sequence> <xsd:attribute name="num2" type="xsd:string" use="required" /> </xsd:restriction> </xsd:complexContent> </xsd:complexType> <xsd:element name="DR" type="xsd:string" /> <xsd:element name="CR" type="xsd:string" /> ----------------------------------------------------以上
- 締切済み
- XML
- SQL ServerのXMLスキーマがうまくいきません。
「SQL Server 2005 Express」を使用しています。 次のようなスキーマをサーバーに登録して CREATE XML SCHEMA COLLECTION dbo.schema_test AS N'<?xml version="1.0" encoding="UTF-16"?> <xsd:schema targetNamespace="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions" xmlns:xsd="http://www.w3.org/2001/XMLSchema" > <xsd:element name="root"> <xsd:complexType mixed="true"> <xsd:choice> <xsd:element name="A" type="xsd:string" /> <xsd:element name="B" type="xsd:string" /> <xsd:element name="C" type="xsd:string" /> </xsd:choice> </xsd:complexType> </xsd:element> </xsd:schema>' ; つぎのようなクエリを試したのですが、 「メッセージ 6913、レベル 16、状態 1、行 5 XML 検証: 要素 'root' の宣言が見つかりませんでした。場所: /*:root[1]」 というエラーメッセージが表示されてしまいます。 DECLARE @xml xml (dbo.schema_text) SET @xml = '<root> <A>AAA</A> <B>BBB</B> <C>ooo</C> </root> ' どなたか分かる方がいらっしゃいましたら、 アドバイスをお願いいたします。
- 締切済み
- SQL Server
- 子要素が順不同の場合のXML Schema の定義
OpenSearch description documents の XML Schema を作成中なのです。ルート要素の <OpenSearchDescription> の各子要素について、出現回数の定義があるのですが、各要素の出現は順不同なのです。 <xsd:element name="OpenSearchDescription"> <xsd:annotation> <xsd:documentation source="https://github.com/dewitt/opensearch/blob/master/opense arch-1-1-draft-6.md#opensearch-description-elements"> The root node of the OpenSearch description document. </xsd:documentation> </xsd:annotation> <xsd:complexType> <xsd:?> <xsd:element ref="ShortName" minOccurs="1" maxOccurs="1" /> <xsd:element ref="Description" minOccurs="1" maxOccurs="1" /> <xsd:element ref="Tags" minOccurs="0" maxOccurs="1" /> <xsd:element ref="Contact" minOccurs="0" maxOccurs="1" /> <xsd:element ref="Url" minOccurs="1" maxOccurs="unbounded" /> <xsd:element ref="LongName" minOccurs="0" maxOccurs="1" /> <xsd:element ref="Image" minOccurs="0" maxOccurs="unbounded" /> <xsd:element ref="Query" minOccurs="0" maxOccurs="unbounded" /> <xsd:element ref="Developer" minOccurs="0" maxOccurs="1" /> <xsd:element ref="Attribution" minOccurs="0" maxOccurs="1" /> <xsd:element ref="SyndicationRight" minOccurs="0" maxOccurs="1" /> <xsd:element ref="AdultContent" minOccurs="0" maxOccurs="1" /> <xsd:element ref="Language" minOccurs="0" maxOccurs="unbounded" /> <xsd:element ref="OutputEncoding" minOccurs="0" maxOccurs="unbounded" /> <xsd:element ref="InputEncoding" minOccurs="0" maxOccurs="unbounded" /> </xsd:?> <xsd:anyAttribute namespace="##any" processContents="skip" /> </xsd:complexType> </xsd:element> 具体的には上記のような内容なのですが、xsd:? の部分にどのように記述すればよいでしょうか。 sequence, choice, all のどれを使用しても上手くいきません。解決方法をご教示頂ければ幸いです。
- ベストアンサー
- XML
- PHPでXMLデータ生成、スキーマで失敗
PHPのDOMDocumentを使ってXMLデータを生成しています。 $dom->schemaValidate('xsdファイル'); で失敗してしまします。 どうしても原因がわからないので吐き出すデータを最小限にして試してみましたが状況が変わりませんでした。 スキーマは以下のようになっています。 <?xml version="1.0" encoding="Shift_JIS" ?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="Response"> <xsd:complexType> <xsd:sequence> <xsd:element name="user" type="user_type" minOccurs="0" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="user_type"> <xsd:sequence> <xsd:element name="developerID" type="xsd:string" /> <xsd:element name="operation" type="xsd:string" /> <xsd:element name="User-Agent" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:schema> そして吐き出されるxml形式のデータは、 <?xml version="1.0" encoding="Shift-JIS"?> <Response> <user> <developerID>testdeveloperID</developerID> <operation>testoperation</operation> <User-Agent>Mozilla/5.0 (Windows NT 6.0; rv:7.0.1) Gecko/20100101 Firefox/7.0.1</User-Agent> </user> </Response> 出てしまうエラーは、 Warning: DOMDocument::schemaValidate() [<a href='domdocument.schemavalidate'>domdocument.schemavalidate</a>]: The document has no document element. in "実行しているphpファイルのパス" on line 12 ちなみに実行phpの12行目には、 $dom->schemaValidate('xsdファイル'); があります。 スキーマを使用してのxmlデータ吐き出しは初めてなのでいろいろと戸惑っています。 何か解決方法もしくはエラーが出てしまう原因をご存知の方がいらっしゃいましたらアドバイスをいただけないでしょうか。 よろしくお願いいたします。
- ベストアンサー
- XML
- PHPでXMLデータ生成、スキーマで失敗
PHPのDOMDocumentを使ってXMLデータを生成しています。 $dom->schemaValidate('xsdファイル'); で失敗してしまします。 どうしても原因がわからないので吐き出すデータを最小限にして試してみましたが状況が変わりませんでした。 スキーマは以下のようになっています。 <?xml version="1.0" encoding="Shift_JIS" ?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="Response"> <xsd:complexType> <xsd:sequence> <xsd:element name="user" type="user_type" minOccurs="0" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="user_type"> <xsd:sequence> <xsd:element name="developerID" type="xsd:string" /> <xsd:element name="operation" type="xsd:string" /> <xsd:element name="User-Agent" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:schema> そして吐き出されるxml形式のデータは、 <?xml version="1.0" encoding="Shift-JIS"?> <Response> <user> <developerID>testdeveloperID</developerID> <operation>testoperation</operation> <User-Agent>Mozilla/5.0 (Windows NT 6.0; rv:7.0.1) Gecko/20100101 Firefox/7.0.1</User-Agent> </user> </Response> 出てしまうエラーは、 Warning: DOMDocument::schemaValidate() [<a href='domdocument.schemavalidate'>domdocument.schemavalidate</a>]: The document has no document element. in "実行しているphpファイルのパス" on line 12 ちなみに実行phpの12行目には、 $dom->schemaValidate('xsdファイル'); があります。 スキーマを使用してのxmlデータ吐き出しは初めてなのでいろいろと戸惑っています。 何か解決方法もしくはエラーが出てしまう原因をご存知の方がいらっしゃいましたらアドバイスをいただけないでしょうか。 よろしくお願いいたします。
- ベストアンサー
- PHP
- XML Schema
いつもお世話になっております。 わからないところがありますので教えてください。以下のXML Schemaで、 <xs:element ref="No" /> と参照しているのですが、参照先となるのは <xs:element ref="No" type="xs:NoType" /> だと思うのですが、自分はこれが <xs:element name="No" type="xs:NoType" /> ではないのかなって思っているのですが、どうなのでしょうか。 よろしくお願いします。 <?xml version="1.0" encoding="Shift_JIS"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Conference" type="ConferenceType" /> <xs:complexType name="ConferenceType"> <xs:sequence> <xs:element name="Room" type="xs:string" /> <xs:element ref="No" /> </xs:sequence> </xs:complexType> <xs:element ref="No" type="xs:NoType" /> <xs:simpleType name="NoType"> <xs:restriction base="xs:float"> <xs:minExclusive value="10" /> <xs:maxExclusive value="15" /> </xs:restriction> </xs:simpleType> </xs:schema>
- ベストアンサー
- XML
- 順不同・任意のタグ
前半は、順番とおりの必須タグで、後半は順不同の任意タグのSchemaの指定を教えてください。 以下の例では、aa,bb,ccが、この順で必須、xx,yy,zzは、この順で任意です。 xx,yy,zzを順番関係なく指定できるようにしたいです。 よろしくお願いします。 <xsd:sequence> <xsd:element name="aa" type="xsd:string"/> <xsd:element name="bb" type="xsd:string"/> <xsd:element name="cc" type="xsd:string"/> <xsd:element name="xx" type="xsd:string" minOccurs="0" /> <xsd:element name="yy" type="xsd:string" minOccurs="0" /> <xsd:element name="zz" type="xsd:string" minOccurs="0" /> </xsd:sequence>
- ベストアンサー
- XML
- DTDとXML Schemaでのデフォルト値の指定について
以下のようなXMLをパーズするプログラムがあります。 ------------------------------------------------------------------ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); dbf.setValidating(true); DocumentBuilder documentBuilder = factory.newDocumentBuilder(); Document doc = documentBuilder.parse(new InputSourc("a.xml")); ------------------------------------------------------------------ a.xmlに以下のようなXMLの構造をDTDで指定した場合のxmlをパーズさせると、 <!DOCTYPE a [ <!ELEMENT a (#PCDATA)> <!ATTLIST a a1 CDATA "abc"> ]> <a/> 上記のプログラム3行目のvalidationの設定がtrue、falseに関わらす、 <a a1="abc"/> というような形式のドキュメントオブジェクトが返ってきます。 ですが、以下のようにXMLの構造をXML Schemaで定義した場合、 a.xml <a xsi:noNamespaceSchemaLocation="b.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> b.xsd <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="a"> <xsd:complexType> <xsd:attribute name="a1" type="xsd:string" default="abc"/> </xsd:complexType> </xsd:element> </xsd:schema> 返ってくるドキュメントオブジェクトのa要素には、validationがtrueの場合はa1属性が含まれる、falseの場合は含まれません。 これは正しい動作なのでしょうか? また、XML Schemaの場合もvalidationがtrue、falseに関わらず、 デフォルト値が指定された属性を含めることはできないのでしょうか?
- ベストアンサー
- XML
お礼
あ、そうか! 起こりうるケースごとに Choice を書けばいいんですね。 頭いいですね! ありがとうございます。 解決できました。