倭マン's BLOG

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

単純化(3) : @datatypeLibrary 属性

単純化の第3段階は @datatypeLibarary 属性の修正です。

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

@datatypeLibrary 属性のエスケープ


@datatypeLibrary 属性値の値を [XLink 1.0] 5.4 節*1 にしたがってエスケープします。

対象ノード
//@datatypeLibrary
操作
URI をエスケープする。

サンプル

<data type="string" datatypeLibrary="http://いろは"/>

f:id:waman:20080515152431p:image

<data type="string" datatypeLibrary="http%3A%2F%2F%E3%81%84%E3%82%8D%E3%81%AF"/>

Java での実装

Java では、java.net.URLEncoder の static メソッド encode(String, String) によってこの処理を行うことができます:

URLEncoder.encode("http://いろは", "UTF-8");

エンコーディングを指定する引数の "UTF-8" を忘れないようにしましょう。

必要な @datatypeLibrary 属性を付加する


@datatypeLibrary 属性がない <data>, <value> 要素があれば、 @datatypeLibrary 属性を継承させます。

@datatypeLibrary を継承するとは、その要素に新たに @datatypeLibrary 属性を付加し、その属性値を @datatypeLibrary 属性をもっている直近の祖先要素の @datatypeLibrary 属性の値に設定することです。 ただし @datatypeLibraray 属性を持っている祖先要素がない場合は空文字列を設定します。

対象ノード
//rng:data[@datatypeLibrary]
//rng:value[not(@datatypeLibrary)]
操作
@datatypeLibrary 属性を継承する。

サンプル 1

<define name="pattern" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <data type="string"/>
</define>

f:id:waman:20080515152431p:image

<define name="pattern" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <data type="string" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"/>
</define>

サンプル 2

祖先要素に @datatypeLibrary 属性がないサンプル:

<define name="an-pattern">
  <data type="string"/>
</define>

f:id:waman:20080515152431p:image

<define name="an-pattern">
  <data type="string" datatypeLibrary=""/>
</define>

不要な @datatypeLibrary 属性の除去


<data>, <value> 要素以外の要素に付いている @datatype 属性を除去します。

対象ノード
//*[(name() != "rng:data") and (name() != "rng:value")]/@datatypeLibrary
操作
除去する。

サンプル

<define name="pattern" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <data type="string" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"/>
</define>

f:id:waman:20080515152431p:image

<define name="pattern">
  <data type="string" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"/>
</define>

事後条件

  • 全ての <data>, <value> 要素が @datatypeLibrary 属性を持ち、その値はエスケープされている。
  • <data>, <value> 要素以外の要素は @datatypeLibrary 属性を持たない。

*1:日本語訳はこちら