読者です 読者をやめる 読者になる 読者になる

倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

MarkupBuilder で RELAX NG スキーマを書いてみた

『MarkupBuilder でスタイルシートを書いてみた』ついでに、MarkupBuidler で RELAX NG スキーマも書いてみました。RELAX NG には、XML 形式でない簡略化された記法『RELAX NG Compact Syntax』というのがあるのであえて MarkupBuilder を使う必要はないかも…

単純化(18) : 要素

単純化の第18段階は、<grammar> 要素の処理です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で除去されています。 </grammar>…

単純化(21) : 要素

単純化の第21段階は、<empty> 要素の処理です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で除去されています。 </empty>…

単純化(20) : 要素

単純化の第20段階は、<notAllowed> 要素の処理です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で除去されています。 </notallowed>…

単純化(19) : , 要素

単純化の第19段階は、<define>, <ref> 要素の処理です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で除去されています</ref></define>…

単純化(17) : @combine 属性

単純化の第17段階は、<define> 要素にある @combine 属性の処理です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階</define>…

単純化 (16) : 制約

このステップでは新たな変形はせず、幾つかの制約を確認します。名前クラス内の <except> 要素 <anyName> 要素下の <except> 要素は、子孫要素として <anyName> 要素を持ってはいけません(どんな名前にもマッチしなくなります 要素がまた <except> 要素を持てばマッチする名前も無いではありませんが、</except></anyname></except></anyname></except>…

単純化(11) : 要素

単純化の第11段階は、<div> 要素。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で除去されています。 <div> 要素を子</div></div>…

単純化(10) : QName

単純化の第10段階は、QName の接頭辞による名前空間 URI の解決です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の…

単純化(15) : 要素

単純化の第15段階は、<zeroOrMore> 要素の変換です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で除去されています。 <zeroOrMore></zeroormore></zeroormore>…

単純化(14) : 要素

単純化の第14段階は、<optional> 要素の変換です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で除去されています。 <mixed></mixed></optional>…

単純化(13) : 要素

単純化の第13段階は、<mixed> 要素の変換です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で除去されています。 <mixed></mixed></mixed>…

単純化(12) : 子要素の個数

単純化の第12段階では、各種要素の子要素の個数が適切になるように XML ツリーを修正します。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありま…

単純化(9) : @ns 属性

単純化の第9段階は、必要な @ns 属性の追加と不要な @ns 属性の除去です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純…

単純化(8) : <element>, <attribute> 要素の @name 属性

単純化の第8段階は <element>, <attribute> 要素の @name 属性の処理です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で除去さ</attribute></element>…

単純化(7) : <include> 要素

単純化の第7段階は、前回の <externalRef> 要素の解決に続き、外部参照要素 <include> の解決です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単</include></externalref>…

単純化(6) : <externalRef> 要素

単純化の第6段階は <externalRef> 要素の解決です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で除去されています。 <externalRef> </externalref></externalref>…

単純化(5) : @href 属性

単純化の第5段階は <externalRef> 要素と <include> 要素の @type 属性の修正です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で</include></externalref>…

単純化(4) : <value> 要素の @type 属性

単純化の第4段階は <value> 要素の @type 属性の修正です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で除去され</value>…

単純化(3) : @datatypeLibrary 属性

単純化の第3段階は @datatypeLibarary 属性の修正です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で除去…

単純化(2) : 空白

単純化の第2段階は空白文字(列)の修正です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 空白文字列を除去する <value>, <param> 要素の子テキスト以外のテキストに対して、無視できる空白を除去します。 対象ノード //*[</param></value>…

単純化(1) : アノテーション

RELAX NG スキーマでのアノテーション(注釈)とは、RELAX NG 名前空間 ("http://relaxng.org/ns/structure/1.0") に属さない要素や、NULL 名前空間 ("") に属さない属性のことを指します。 これは、それらがスキーマ定義としては意味を持たないため、コメン…

単純化のプロセス

RELAX NG スキーマ定義は妥当性検証を行う前に必ず、単純化 (simplification) というプロセスによって助長だが(プログラム等で)扱いやすい形に変形されます。 この変形の手順の概要は以下のようになっています(正式にはRELAX NG の仕様書を参照のこと):…

@combine 属性

<define> 要素に @combine 属性を付加することによって、同等なパターンを別個に書くことができます。@combine 属性の基本 @combine 要素は以下のように、同名の <define> 要素に付加します。 属性値は「choice」または「interleave」を指定します: <grammar xmlns="http://relaxng.org/ns/structure/1.0"> <start> <ref name="xslt"/> </start> <define name="xslt" combine="choice"> </define></grammar></define></define>

ServiceLoader による Java SE 6 での RELAX NG 妥当性検証

以前の記事で、Java SE 6 で javax.xml.validation パッケージ内のクラスを用いて RELAX NG による妥当性検証を行う方法を見ました(一覧)。 今回は同様のことを java.util.ServiceLoader クラスを用いて 行う方法を見ていきます。 今回の方法を用いると、…

名前空間を指定する際の注意

RELAX NG で名前空間を指定する際の注意を幾つか。@ns 属性と QName の優先順位 1つの要素もしくは属性の定義に対して @ns 属性と QName が両方とも指定されている場合、QName による指定が優先されます。 例えば次のようなスキーマ定義があったとすると <element xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <name ns="abc">xs</name></element>…

名前空間の指定方法

RELAX NG で名前空間を指定する方法は次の2通りあります: @ns 属性を使う QName を使う 以下でそれぞれを見ていきましょう*1。@ns 属性を使う 要素、属性、名前の定義に 「@ns 属性」を付け加えることによって、それらの名前が属する名前空間を指定すること…

要素の概要 (7) -- 外部参照

今回は外部参照をする要素。 <externalRef> <include> どちらも参照する外部ファイルを指定する属性「@href 属性」を持たなければなりません。<externalRef> 要素 <externalRef> 要素は、外部ファイルに定義されているパターンをそのまま読み込む要素です。 パターンが書けるところには何処にでも書けます。 </externalref></externalref></include></externalref>…

要素の概要 (6) -- 名前パターン

今回は名前に関連する要素。 <name> <anyName> <nsName> <except> <name> 要素 <name> 要素は要素や属性の名前を定義するのに使います。 <element> 要素や <attribute> 要素の直下に <name> 要素を書くこともできますが、以下のように <choice> 要素によって幾つかの名前の中から選択することができます: <element> <choice> <name>stylesheet</name> <name>transform</name> </choice> ... </element> 名</choice></name></attribute></element></name></name></except></nsname></anyname></name>…

要素の概要 (5) -- 値

今回は文法構造に関する要素。 <value> <data> <param> <list> <value> 要素 <value> は「属性の値」や「テキストの内容」を指定します。例えば、<version> 要素の子テキストが "1.0" であることを指定したい場合、つまり <version>1.0</version> という文書を定義したい場合、スキーマ定義は以下のようにします: <element name="version" xmlns="http://relaxng.org/ns/structure/1.0"> <value>1.0</value> </element> ★値の選択★</version></value></value></list></param></data></value>…

要素の概要 (4) -- 文法構造

今回は文法構造に関する要素。 <grammar> <start> <define> <ref> <notAllowed> <div> <parentRef> <grammar> 要素, <start> 要素, <define> 要素 簡単なスキーマ定義の場合、定義対象の文書のルート要素を定義する <element> 要素を、スキーマ定義のルート要素にするのが簡単です: <element name="root" xmlns="http://relaxng.org/ns/structure/1.0"> <empty/> </element> しかし、複雑なスキーマ定義になると、以下のように </element></define></start></grammar></parentref></div></notallowed></ref></define></start></grammar>

要素の概要 (3) -- 論理構造 2

今回も論理構造に関する要素。 <choice> <group> <interleave> <mixed> <choice> 要素 <choice> 要素は、子要素で定義されるパターンのうち、どれか1つを「選択」するパターンです。 次のスキーマ定義は <element name="parent" xmlns="http://relaxng.org/ns/structure/1.0"> <choice> <element name="child1"><empty/></element> <element name="child2"><empty/></element> </choice> </element></choice></choice></mixed></interleave></group></choice>

要素の概要 (1) -- XML ノード

前回、RELAX NG に定義されている要素を分類しましたが、それぞれのカテゴリに属する要素を簡単に見ていきます(参考「RELAX NG 入門」)。今回は XML ノードを定義する要素。 <element> <empty> <attribute> <text> <element> 要素, <empty> 要素 <element> 要素は要素を定義する要素です。 @name 属性によって要素名を</element></empty></element></text></attribute></empty></element>…

要素の概要 (2) -- 論理構造 1

今回は論理構造に関する要素。 <optional> <oneOrMore> <zeroOrMore> <optional> 要素 <optional> 要素は「あってもなくてもよい」パターンを定義します。 正規表現では「?」に対応します。 例えば、次のようなスキーマ定義は <element name="parent" xmlns="http://relaxng.org/ns/structure/1.0"> <optional> <element name="child"><empty/></element> </optional> </element> 次のどちらにもマッチします: </optional></optional></zeroormore></oneormore></optional>

独断と偏見による要素の分類

次回以降で、RELAX NG スキーマの使い方を軽く見ていきますが、その前に、RELAX NG に定義されている要素を拙者の独断と偏見で幾つかのカテゴリーに分類しておきます: カテゴリー 要素 XML ノード element, attribute, text, empty 論理構造1 optional, one…

RELAX NG で妥当性検証 by Jing

今回は Jing を使って、RELAX NG による XML 文書の妥当性検証を行う方法を見ていきます。 Jing の JAR ファイル等はこちらからダウンロードできます。 また、Maven2 で依存性に付加したい場合は、次のような <dependency> 要素を設定してください: <dependency> <groupId>thaiopensource</groupId> <artifactId>jing</artifactId></dependency></dependency>…

Java SE 6 で RELAX NG での妥当性検証をする場合の注意

Java SE 6 での RELAX NG スキーマによる妥当性検証 以前の記事で RELAX NG を用いた妥当性検証の実行方法を見ました。 それには、以下のようにして SchemaFactory オブジェクトを取得する必要がありました: SchemaFactory factory = SchemaFactory.newInst…

javax.xml.validation で RELAX NG を使うための POM プロジェクト

前回、Maven2 プロジェクト内で RELAX NG による妥当性検証を行うために必要なライブラリの設定の仕方をみました。ただし、それらを毎回 POM ファイルに書くのは面倒なので、それらの依存性を別の POM プロジェクトに書いて、それを再利用できる用にしましょ…

javax.xml.validation で RELAX NG を使う in Maven2 プロジェクト

RELAX NG を用いて妥当性検証を行うには、幾つかのライブラリを CLASSPATH に含める必要がありました。 必要なのは msv (multi schema validator) とその関連ライブラリ msv isorelax relaxngDatatype xsdlib それに加えて、msv と javax.xml.validation パ…

javax.xml.validation で RELAX NG を使う

前回は W3C XML Schema を使って XML 文書の妥当性検証を行う方法を見ました。 ただし、 javax.xml.validation パッケージに定義されてあるクラス群は、スキーマ言語によらない妥当性検証の方法を提供することができます。 今回はそれなりに用いられるスキー…