倭マン's BLOG

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

名前空間の指定方法

RELAX NG名前空間を指定する方法は次の2通りあります:

  • @ns 属性を使う
  • QName を使う

以下でそれぞれを見ていきましょう*1

@ns 属性を使う


要素、属性、名前の定義に 「@ns 属性」を付け加えることによって、それらの名前が属する名前空間を指定することができます。 例えば、以下のように書きます:

<element name="stylesheet" ns="http://www.w3.org/1999/XSL/Transform">
  ...
</element>
<element>
  <name ns="http://www.w3.org/1999/XSL/Transform">stylesheet</name>
  ...
</element>
<attribute name="href" ns="http://www.w3.org/1999/xlink">
  <text/>
</attribute>

@ns 属性がないとき -- <element>, <name> 要素の場合

<element>, <name> 要素( <nsName> 要素も同じ)に @ns 属性がなければ、祖先要素をさかのぼって @ns 属性を探します。 例えば、次のような定義があったとするとします:

<element name="stylesheet" ns="http://www.w3.org/1999/XSL/Transform">
  <oneOrMore>
    <element name="template">
      ...
    </element>
  </oneOrMore>
  ...
</element>

これは以下と同じになります:

<element name="stylesheet" ns="http://www.w3.org/1999/XSL/Transform">
  <oneOrMore>
    <element name="template" ns="http://www.w3.org/1999/XSL/Transform">
      ...
    </element>
  </oneOrMore>
  ...
</element>

祖先要素をさかのぼっても @ns 属性がなければ、空文字列が設定されます。

@ns 属性がないとき -- <attribute> 要素の場合

<attribute> 要素は <element> 要素などと違い、@ns 属性が指定されていなければ、祖先要素をさかのぼらず空文字列が設定されます。 これは、名前空間接頭辞のない属性はすべて「NULL 名前空間」に属するためです。 例えば次のスキーマ

<element name="stylesheet" ns="http://www.w3.org/1999/XSL/Transform">
  <attribute name="version"/>
  ...
</element>

以下のものと同じになります:

<element name="stylesheet" ns="http://www.w3.org/1999/XSL/Transform">
  <attribute name="version" ns=""/>
  ...
</element>

ただし、属性の名前が <name> 要素(もしくは <nsName> 要素)で指定されている場合は祖先要素をさかのぼります。 次のスキーマ

<element name="stylesheet" ns="http://www.w3.org/1999/XSL/Transform">
  <attribute>
    <name>version</name>
  </attribute>
  ...
</element>

以下のものと同じになります:

<element name="stylesheet" ns="http://www.w3.org/1999/XSL/Transform">
  <attribute>
    <name ns="http://www.w3.org/1999/XSL/Transform">version</name>
  </attribute>
  ...
</element>

QName を使う


QName を用いて名前空間を指定する方法にも、@name 属性を使う方法と <name> 要素を使う方法があります。 どちらも名前を指定する箇所に名前空間接頭辞を付加した名前を指定し、その名前空間接頭辞に対応する名前空間宣言も付け加えておきます:

<element name="xsl:stylesheet" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  ...
</element>
<element xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <name>xsl:stylesheet</name>
  ...
</element>

名前空間宣言は(通常そうされるように)祖先要素から子孫要素へ受け継がれます。 属性の定義に対しても同じように QName を指定することができます。

名前空間接頭辞がない場合

名前空間接頭辞がない場合、その名前は「@ns 属性で指定される名前空間」もしくは「NULL 名前空間」に属します。 デフォルト名前空間に属するわけではありません

サンプルを見てみましょう。 以下のように <root> 要素が定義されていたとします:

<element name="root" xmlns="http://relaxng.org/ns/structure/1.0">
  <empty/>
</element>

このとき、<root> 要素は「NULL 名前空間」に属します。 名前空間http://relaxng.org/ns/structure/1.0」には属しません

*1:以下で、名前空間 URI に空文字列が設定されている場合、その名前が「NULL 名前空間」に属すると書いていますが、正確には「その名前がどの名前空間にも属しない」と言うのかも知れません。