倭マン's BLOG

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

単純化(9) : @ns 属性

単純化の第9段階は、必要な @ns 属性の追加と不要な @ns 属性の除去です。

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

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


@ns 属性がない <name>, <nsName>, <value> 要素があれば、@ns 属性を継承します。

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

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

サンプル 1

<element ns="an-namespace">
  <name>an-element</name>
</element>

<element ns="an-namespace">
  <name ns="an-namespace">an-element</name>
</element>

サンプル 2

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

<define name="an-pattern">
  <value datatypeLibrary="" type="token"/>
</define>

<define name="an-pattern">
  <value datatypeLibrary="" type="token" ns=""/>
</define>

不要な @ns 属性の除去


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

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

サンプル

<element ns="an-namespace">
  <name ns="an-namespace">an-element</name>
</element>

<element>
  <name ns="an-namespace">an-element</name>
</element>

事後条件

  • すべての <name>, <nsName>, <value> 要素が @ns 属性を持っている
  • <name>, <nsName>, <value> 要素以外の要素は @ns 属性を持っていない