倭マン's BLOG

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

単純化(21) : 要素

単純化の第21段階は、<empty> 要素の処理です。

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

このステップでは、以下で説明する4つの操作を、どれも行えなくなるまで繰り返し適用します。

2つの <empty> 要素を子要素にもつ <group>, <interleave>, <choice> 要素

対象ノード
//rng:group[count(rng:empty) = 2]
//rng:interleave[count(rng:empty) = 2]
//rng:choice[count(rng:empty) = 2]
操作
<empty> 要素に変える。

サンプル

<group>
  <empty/>
  <empty/>
</group>

<empty/>

1つの <empty> 要素を子要素にもつ <group>, <interleave> 要素

対象ノード
//rng:group[count(rng:empty) = 1]
//rng:interleave[count(rng:empty) = 1]
操作
<empty> 要素でない子要素に置き換える。

サンプル

<group>
  <value>abc</value>
  <empty/>
</group>

<value>abc</value>

1つの <empty> 要素を子要素にもつ <choice> 要素

対象ノード
//rng:choice[count(rng:empty) = 1]
//rng:interleave[count(rng:empty) = 1]
操作
2番目の子要素が <empty> 要素なら、1番目と2番目の子要素を入れ替える。

サンプル

<choice>
  <value>abc</value>
  <empty/>
</choice>

<choice>
  <empty/>
  <value>abc</value>
</choice>

<empty> 要素を子要素にもつ <oneOrMore> 要素

対象ノード
//rng:oneOrMore[rng:empty]
操作
<empty> 要素に置き換える。

サンプル

<oneOrMore>
  <empty/>
</oneOrMore>

<empty/>

事後条件

  • <empty> 要素が <group>, <interleave>, <oneOrMore> 要素の子要素としては現れない。
  • <empty> 要素が <choice> 要素の2番目の子要素として現れない。