倭マン's BLOG

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

名前空間を指定する際の注意

RELAX NG名前空間を指定する際の注意を幾つか。

@ns 属性と QName の優先順位


1つの要素もしくは属性の定義に対して @ns 属性と QName が両方とも指定されている場合、QName による指定が優先されます。 例えば次のようなスキーマ定義があったとすると

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

これは、次のスキーマ定義と同じと見なされます:

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

これはまた、以下のスキーマ定義と等価です:

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

<externalRef> 要素の @ns 属性


<externalRef> 要素に @ns 属性が付加されている場合、<externalRef> 要素が参照先のパターンに置き換えられた後、@ns 属性が付加されます。

サンプルを見てみましょう。 まず、参照先のスキーマ定義「child.rng」は以下のようであるとします:

<!-- child.rng -->
<element name="child" xmlns="http://relaxng.org/ns/structure/1.0">
  <empty/>
</element>

このスキーマ定義を参照する、以下のようなスキーマ定義があると、

<element name="parent" xmlns="http://relaxng.org/ns/structure/1.0">
  <externalRef href="child.rng" ns="some-namespace"/>
</element>

実質的に、以下のスキーマと同じと見なされます:

<element name="parent" xmlns="http://relaxng.org/ns/structure/1.0">
  <element name="child" ns="some-namespace">
    <empty/>
  </element>
</element>