- PR -

XMLschemaの書き方

1
投稿者投稿内容
deu
会議室デビュー日: 2003/01/31
投稿数: 6
投稿日時: 2003-10-03 16:42
<aa bbb="ccc">ddd</aa>
<aa bbb="ccc"/>
でも構わない場合のスキーマの表記方法はどうしたらいいでしょうか?

<xs:element name="aa">
<xs:complexType>
<xs:simpleContent
<xs:extension base="xs:string"> <!-- これがoptional -->
<xs:attribute name="hogehoge" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>

TAKABE
常連さん
会議室デビュー日: 2003/05/14
投稿数: 43
投稿日時: 2003-10-04 12:54
deuさま、こんにちは。
上記のインスタンスでは属性名がbbbであるにもかかわらず、スキーマ側はhogehogeになっているという誤植がありますが、それは置いておいて… そこを直せばどちらのインスタンスも、XSVやMSXMLで、このスキーマでエラーなしに通過することを確認できました。
deu
会議室デビュー日: 2003/01/31
投稿数: 6
投稿日時: 2003-10-09 18:43
TAKABEさん、ありがとうございます。確認してみます。

また、よろしければもうひとつお聞きしたいのですが、

<xsd:element name="aaa" maxOccurs="10">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="bbb" type="xsd:positiveInteger" fixed="1"/>
<xsd:element name="ccc" type="xsd:positiveInteger"/>
<xsd:element name="ddd" type="xsd:positiveInteger"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

このように、同じaaa要素が10回まで現れていいものとして、
その要素ごとに子要素bbbの固定値(fixed="1")を、例えばカウントアップ
等のようにすべて買えたいのですが、どのように表記したらよいでしょうか?

よろしくお願いいたします。
TAKABE
常連さん
会議室デビュー日: 2003/05/14
投稿数: 43
投稿日時: 2003-10-10 11:13
 deuさま、こんんちは。
 私が誤解しているかもしれませんが、deuさまの問題を以下のような例題であろうと解釈しました。
 例えば、root要素の内容として、aaa要素が1〜10個まで出現しうる。各aaa要素のIDとして、それぞれのaaa要素の内容であるbbb要素の値が用いられる、といった話かと思いました。

【サンプルインスタンス】

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

<aaa>
<bbb>1</bbb>
<ccc>60</ccc>
<ddd>3600</ddd>
</aaa>

<aaa>
<bbb>2</bbb>
<ccc>12</ccc>
<ddd>365</ddd>
</aaa>

<aaa>
<bbb>3</bbb>
<ccc>7</ccc>
<ddd>49</ddd>
</aaa>

</root>

 この場合、1つずつbbbの値がカウントアップされているかどうかといったチェックは、XML Schemaの能力の範囲外です。ただし、bbbの値がIDとして、重なった値がないかどうかを定義することは可能です。
 一般にIDとしては、DTDでも定義できるID型の属性が使われることが多いのですが、この場合はID型を使うことはできません。なぜなら
1.IDとして使いたいbbbは、aaa要素の属性ではなくて要素である。
2.ID型はNameの規則に従わなければならないが、bbbはpositiveInteger型である。
 というケースであるからです。
 そのため、このような場合は「key」を使わなければなりません。

<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="root">

<xsd:complexType>
<xsd:sequence>
<xsd:element ref="aaa" maxOccurs="10" />
</xsd:sequence>
</xsd:complexType>

<xsd:key name="aaa-bbb">
<xsd:selector xpath="aaa" />
<xsd:field xpath="bbb" />
</xsd:key>

</xsd:element>

<xsd:element name="aaa">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="bbb" type="xsd:positiveInteger"/>
<xsd:element name="ccc" type="xsd:positiveInteger"/>
<xsd:element name="ddd" type="xsd:positiveInteger"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

</xsd:schema>

「key」についての詳細は
http://www.cityfujisawa.ne.jp/~yanai/xml/schema/step35.html
http://www.cityfujisawa.ne.jp/~yanai/xml/schema/step35-2.html
http://www.cityfujisawa.ne.jp/~yanai/xml/schema/step35-3.html
 などをご参照いただければ幸いです。
deu
会議室デビュー日: 2003/01/31
投稿数: 6
投稿日時: 2003-10-10 14:04
TAKABEさま、ありがとうございます。
私の書き方が悪かったのですが、Bの値のチェックを行いたいわけでなく、
fixed属性を用いて、繰り返し事に違う値を入れたいのです。

つまり、同じ構造の「aaa」という属性以下の塊が複数回現れるとして、
その子要素、「bbb」にfixedを用いて、それぞれ違う値を指定したい、
という希望です。

判りにくくて、申し訳ありません。
TAKABE
常連さん
会議室デビュー日: 2003/05/14
投稿数: 43
投稿日時: 2003-10-10 17:34
 deuさま、私の理解が拙くてすみません。未だにdeuさまの意図されることが理解できず申し訳ないのですが、どのようなインスタンスが良くて、どのようなインスタンスが悪いのか、具体的にお書きいただければ、私の理解力のない頭でもわかるかもしれません。

>fixed属性を用いて、繰り返し事に違う値を入れたいのです

 fixed属性を使うと、かえって必ず同じ値になると思うのですが…
 お手数をおかけいたしますが、どうぞよろしく御願い致します。
1

スキルアップ/キャリアアップ(JOB@IT)