RELAX NG
『MarkupBuilder でスタイルシートを書いてみた』ついでに、MarkupBuidler で RELAX NG スキーマも書いてみました。RELAX NG には、XML 形式でない簡略化された記法『RELAX NG Compact Syntax』というのがあるのであえて MarkupBuilder を使う必要はないかも…
単純化の第18段階は、<grammar> 要素の処理です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で除去されています。 </grammar>…
単純化の第21段階は、<empty> 要素の処理です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で除去されています。 </empty>…
単純化の第20段階は、<notAllowed> 要素の処理です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で除去されています。 </notallowed>…
単純化の第19段階は、<define>, <ref> 要素の処理です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で除去されています</ref></define>…
単純化の第17段階は、<define> 要素にある @combine 属性の処理です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階</define>…
このステップでは新たな変形はせず、幾つかの制約を確認します。名前クラス内の <except> 要素 <anyName> 要素下の <except> 要素は、子孫要素として <anyName> 要素を持ってはいけません(どんな名前にもマッチしなくなります 要素がまた <except> 要素を持てばマッチする名前も無いではありませんが、</except></anyname></except></anyname></except>…
単純化の第11段階は、<div> 要素。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で除去されています。 <div> 要素を子</div></div>…
単純化の第10段階は、QName の接頭辞による名前空間 URI の解決です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の…
単純化の第15段階は、<zeroOrMore> 要素の変換です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で除去されています。 <zeroOrMore></zeroormore></zeroormore>…
単純化の第14段階は、<optional> 要素の変換です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で除去されています。 <mixed></mixed></optional>…
単純化の第13段階は、<mixed> 要素の変換です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で除去されています。 <mixed></mixed></mixed>…
単純化の第12段階では、各種要素の子要素の個数が適切になるように XML ツリーを修正します。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありま…
単純化の第9段階は、必要な @ns 属性の追加と不要な @ns 属性の除去です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純…
単純化の第8段階は <element>, <attribute> 要素の @name 属性の処理です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で除去さ</attribute></element>…
単純化の第7段階は、前回の <externalRef> 要素の解決に続き、外部参照要素 <include> の解決です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単</include></externalref>…
単純化の第6段階は <externalRef> 要素の解決です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で除去されています。 <externalRef> </externalref></externalref>…
単純化の第5段階は <externalRef> 要素と <include> 要素の @type 属性の修正です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で</include></externalref>…
単純化の第4段階は <value> 要素の @type 属性の修正です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で除去され</value>…
単純化の第3段階は @datatypeLibarary 属性の修正です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 サンプルでは見やすさのために空白や改行を入れているところがありますが、実際には単純化の第2段階で除去…
単純化の第2段階は空白文字(列)の修正です。 対象ノードの箇所では接頭辞 "rng" は「RELAX NG 名前空間」に関連づけられているとします。 空白文字列を除去する <value>, <param> 要素の子テキスト以外のテキストに対して、無視できる空白を除去します。 対象ノード //*[</param></value>…
RELAX NG スキーマでのアノテーション(注釈)とは、RELAX NG 名前空間 ("http://relaxng.org/ns/structure/1.0") に属さない要素や、NULL 名前空間 ("") に属さない属性のことを指します。 これは、それらがスキーマ定義としては意味を持たないため、コメン…
RELAX NG スキーマ定義は妥当性検証を行う前に必ず、単純化 (simplification) というプロセスによって助長だが(プログラム等で)扱いやすい形に変形されます。 この変形の手順の概要は以下のようになっています(正式にはRELAX NG の仕様書を参照のこと):…
<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>
以前の記事で、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 属性」を付け加えることによって、それらの名前が属する名前空間を指定すること…
今回は外部参照をする要素。 <externalRef> <include> どちらも参照する外部ファイルを指定する属性「@href 属性」を持たなければなりません。<externalRef> 要素 <externalRef> 要素は、外部ファイルに定義されているパターンをそのまま読み込む要素です。 パターンが書けるところには何処にでも書けます。 </externalref></externalref></include></externalref>…
今回は名前に関連する要素。 <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>…
今回は文法構造に関する要素。 <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>…