倭マン's BLOG

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

要素の概要 (6) -- 名前パターン

今回は名前に関連する要素。

  • <name>
  • <anyName>
  • <nsName>
  • <except>

<name> 要素


<name> 要素は要素や属性の名前を定義するのに使います。 <element> 要素や <attribute> 要素の直下に <name> 要素を書くこともできますが、以下のように <choice> 要素によって幾つかの名前の中から選択することができます:

<element>
  <choice>
    <name>stylesheet</name>
    <name>transform</name>
  </choice>
  ...
</element>

名前空間の指定方法はそのうちに。

<anyName> 要素


<anyName> 要素は全ての名前にマッチする(名前)パターンです。

★任意の要素にマッチするパターン★

以下のパターンは、任意の要素にマッチします:

<grammar xmlns="http://relaxng.org/ns/structure/1.0">

  <start>
    <ref="anyElement"/>
  </start>

  <define name="anyElement">
    <element>

      <anyName/>

      <zeroOrMore>
        <choice>
          <ref name="anyAttribute"/>
          <text/>
          <ref name="anyElement"/>
        </choice>
      </zeroOrMore>

    </element>
  </define>

  <define name="anyAttribute">
    <attribute>
      <anyName/>
    </attribute>
  </define>
</grammar>

<nsName> 要素


<nsName> 要素は特定の名前空間に属する名前を定義する要素です。 名前空間を特定するには @ns 属性を用います。 例えば RELAX NG 名前空間 ("http://relaxng.org/ns/structure/1.0") に属する名前を持つ要素は以下のように定義します:

<element>
  <nsName ns="http://relaxng.org/ns/structure/1.0"/>
  ...
</element>

<nsName> 要素に @ns 属性が無ければ、祖先要素を遡って探します。 それでもなければ、空文字列 "" が指定されます。

<except> 要素


<anyName> 要素や <nsName> 要素の子要素として <except> 要素を書くことで、ある(名前)パターンにマッチする名前を除去することができます。

★ある名前空間に属しない名前を持つ要素のパターン★

以下の <define> 要素は、RELAX NG 名前空間に属しないすべての要素にマッチします:

<define name="foreignElement">
  <element>

    <anyName>
      <except>
        <nsName ns="http://relaxng.org/ns/structure/1.0"/>
      </except>
    </anyName>

    <zeroOrMore>
      <choice>
        <ref name="anyAttribute"/>
        <text/>
        <ref name="anyElement"/>
      </choice>
    </zeroOrMore>

  </element>
</define>

anyAttribute, anyElement は上記の「任意の要素にマッチするパターン」内で定義されているパターンです。