- PR -

属性付のelementのチェックは可能でしょうか?

1
投稿者投稿内容
パブロフ
会議室デビュー日: 2005/01/12
投稿数: 13
投稿日時: 2005-01-12 22:41
XML Schema 初心者です。

以下のようなXMLメッセージをXML Schema を用いてレングスチェックをする事は
可能でしょうか?
有識者のみなさま御教授お願いします。

<?xml version="1.0" encoding="UTF-8"?>
<MESSAGE>
<PRICE CURR="ADP">112.12</PRICE> <!-- PRICE自体のレングスチェックを行いたいです -->
<COUPON>111.98</COUPON>
</MESSAGE>

現在、定義しているスキーマを下記に記述します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="COUPON">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="0"/>
<xs:maxLength value="17"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="PRICE">
<xs:complexType>
<xs:attribute name="CURR" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse"/>
<xs:enumeration value="CHF"/>
<xs:enumeration value="ZAL"/>
<xs:enumeration value="ADP"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>


[ メッセージ編集済み 編集者: パブロフ 編集日時 2005-01-12 22:51 ]

[ メッセージ編集済み 編集者: パブロフ 編集日時 2005-01-12 23:07 ]
TAKABE
常連さん
会議室デビュー日: 2003/05/14
投稿数: 43
投稿日時: 2005-01-13 10:17
 パブロフさま、こんにちは。
 ご質問が
「レングスチェックをする事は 可能でしょうか?」
「PRICE自体のレングスチェックを行いたいです」
 としか書かれていなかったため、PRICE要素の「何を」「どういうふうに」レングスのチェックをしたいのかがよくわからなかったのですが、一応、PRICE要素の内容となるテキストを、COUPON要素の内容となるテキストと同じ規則でレングスをチェックしたいのだ、というご質問だろうかと想像して、以下のXML Schemaを書いてみました。

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

<xs:element name="MESSAGE" type="MESSAGEType" />

<xs:complexType name="MESSAGEType">
<xs:sequence>
<xs:element ref="PRICE" />
<xs:element ref="COUPON" />
</xs:sequence>
</xs:complexType>

<xs:element name="PRICE" type="PRICEType" />

<xs:complexType name="PRICEType">
<xs:simpleContent>
<xs:extension base="COUPONType">
<xs:attribute name="CURR" type="CURRType" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>

<xs:simpleType name="CURRType">
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse"/>
<xs:enumeration value="CHF"/>
<xs:enumeration value="ZAL"/>
<xs:enumeration value="ADP"/>
</xs:restriction>
</xs:simpleType>

<xs:element name="COUPON" type="COUPONType" />

<xs:simpleType name="COUPONType">
<xs:restriction base="xs:string">
<xs:minLength value="0"/>
<xs:maxLength value="17"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>

</xs:schema>
TAKABE
常連さん
会議室デビュー日: 2003/05/14
投稿数: 43
投稿日時: 2005-01-13 17:32
 上記スキーマについての簡単な解説です、
(パブロフさまのご質問が、COUPON要素と同じようにテキストのレングスを制限したPRICE要素を宣言することだと仮定して)

<xs:simpleType name="COUPONType">
<xs:restriction base="xs:string">
<xs:minLength value="0"/>
<xs:maxLength value="17"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>

 の部分で、文字数が制限された単純型であるCOUPONTypeを定義しています。このCOUPONTypeはそのまま、

<xs:element name="COUPON" type="COUPONType" />

 とCOUPON要素の宣言に用いられますし、また、

<xs:complexType name="PRICEType">
<xs:simpleContent>
<xs:extension base="COUPONType">
<xs:attribute name="CURR" type="CURRType" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>

 というふうに、このCOUPONTypeを基準型(base)として拡張(extension)することによりPRICETypeが定義されます。
 拡張される部分はCURRTypeとして宣言されるCURR属性だけであり、PRICETypeの内容としてのテキストはCOUPONTypeと同じままです。
 そしてこのPRICETypeを用いて、

<xs:element name="PRICE" type="PRICEType" />

 というふうに、PRICE要素が宣言されることになります。

 いわゆる、単純型内容を持った複合型の定義については、
http://www.cityfujisawa.ne.jp/~yanai/xml/schema/step13.html
 をご参照くださいませ。
パブロフ
会議室デビュー日: 2005/01/12
投稿数: 13
投稿日時: 2005-01-13 18:41
素早いの回答ありがとうございます。
つたない質問に想像していただいてまで回答を頂き感謝しております。
早速、明日試してみたいと思います。
また、何かにつまずいた時には御教授いただくかと思います。
今後ともよろしくお願いします。

また、PRICE要素の内容となるテキストを最小長=0、最大長=18という
規則でレングスをチェックするとなると以下の定義でよろしいのでしょうか?

現在、実行環境が無くTAKABEさまの推薦の
http://www.cityfujisawa.ne.jp/~yanai/xml/schema/step13.html
にて自分なりに解釈しました。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="MESSAGE" type="MESSAGEType"/>
<xs:complexType name="MESSAGEType">
<xs:sequence>
<xs:element ref="PRICE"/>
<xs:element ref="COUPON"/>
</xs:sequence>
</xs:complexType>
<xs:element name="PRICE" type="PRICEType"/>
<xs:complexType name="PRICEType">
<xs:simpleContent>
<xs:extension base="DATAType">
<xs:attribute name="CURR" type="CURRType"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="CURRType">
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse"/>
<xs:enumeration value="CHF"/>
<xs:enumeration value="ZAL"/>
<xs:enumeration value="ADP"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="DATA" type="DATAType"/>
<xs:simpleType name="DATAType">
<xs:restriction base="xs:string">
<xs:minLength value="0"/>
<xs:maxLength value="18"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="COUPON" type="COUPONType"/>
<xs:simpleType name="COUPONType">
<xs:restriction base="xs:string">
<xs:minLength value="0"/>
<xs:maxLength value="17"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>


[ メッセージ編集済み 編集者: パブロフ 編集日時 2005-01-13 19:10 ]
TAKABE
常連さん
会議室デビュー日: 2003/05/14
投稿数: 43
投稿日時: 2005-01-14 09:26
 パブロフ様、こんにちは。

>また、PRICE要素の内容となるテキストを最小長=0、最大長=18という
>規則でレングスをチェックするとなると以下の定義でよろしいのでしょうか?

 はい、基本的に上記の考え方でよいと思いますし、最初に示されたXMLインスタンスを上記のスキーマでXSVを使ってValidateできました。

 ただ一つだけ蛇足と思われるのは、

<xs:element name="DATA" type="DATAType"/>

 の一行です。この一行はDATATypeという型をしたDATA要素を宣言しているのですが、最初に示されたXMLインスタンスの中にはどこにもDATA要素なるものは存在しません。DATATypeという型はPRICETypeへ拡張されるための基準型としてだけ使われる型であり、この型を使って使わない要素を宣言しても別に実害はありませんが、使わないものを宣言するのも無駄なような気がして、それがちょっと気になったところでした。
パブロフ
会議室デビュー日: 2005/01/12
投稿数: 13
投稿日時: 2005-01-14 11:25
こんにちは、TAKEBEさま
上記指摘どおり、以下の定義を外してチェックを行っても
上手くチェックを行ってくれました。
<xs:element name="DATA" type="DATAType"/>

ご指摘、ありがとうございました。

[ メッセージ編集済み 編集者: パブロフ 編集日時 2005-01-14 11:27 ]
1

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