<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/xml.xsl" type="text/xsl"?><feed xmlns="http://www.w3.org/2005/Atom">
  <title>nulog, NULL::something : out of the headphone &gt; 2004 &gt; December &gt; 04 &gt; XML の属性の名前空間</title>
  <link href="http://lowreal.net/logs/2004/12/04/2"/>
  <icon>http://lowreal.net/img/banner.png</icon>
  <link rel="self" type="application/atom+xml" href="http://lowreal.net/logs/2004/12/04/2.atom"/>
  <link rel="alternate" type="application/xhtml+xml" href="http://lowreal.net/logs/2004/12/04/2.xhtml"/>
  <updated>2004-12-04T00:59:06+09:00</updated>
  <author>
    <name>cho45(砂糖)</name>
  </author>
  <id>http://lowreal.net/2004/12/04/2</id>
  <entry>
    <title>XML の属性の名前空間</title>
    <link rel="alternate" type="text/html" href="http://lowreal.net/logs/2004/12/04/2.html"/>
    <link rel="alternate" type="application/xml+xhtml" href="http://lowreal.net/logs/2004/12/04/2.xhtml"/>
    <updated>2004-12-04T00:59:06+09:00</updated>
    <published>2004-12-04T00:59:06+09:00</published>
    <id>http://lowreal.net/2004/12/04/2</id>
    <category term="web"/>
    <content type="xhtml" xml:base="http://lowreal.net/">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>ここ最近気になっていたのでちゃんと解消しておこう。基礎が出来てなきゃダメダメ。</p>
        <p>まず重要なのは、<em>属性にはデフォルトネームスペースが適用されない</em>のにされると勘違いしていたこと。属性と要素では属する partition が違う。接頭辞がない属性がよくある (たとえば <abbr title="Extensible Hyper Text Markup Language">XHTML</abbr> とか) せいで完全に勘違い。</p>
        <p>同じように見える属性でも厳密には違う場合が存在する。見た目的には接頭辞がついている属性と、付いていない属性では差がある。</p>
        <pre title="サンプルのXML" class="XML">&lt;f:foo xmlns:f="http://example.com/foo"&gt;
    &lt;f:far attr="ex"/&gt;
    &lt;b:baz xmlns:b="http://example.com/baz"&gt;
        &lt;b:bar f:attr="ex"/&gt;
    &lt;/b:baz&gt;
&lt;/f:foo&gt;</pre>
        <p>この例で <samp>attr="ex"</samp> と <samp>f:attr="ex"</samp> は属している名前空間は同じにも関わらず展開すると異なる。これも partition の違い。</p>
        <del datetime="2004-12-19T14:41:00+09:00">
          <p>partition には三つあって、一つは全ての要素が属するとこ。あとは属性の属する partition で、一つはグローバルな属性が属する (上の例では f:attr) とこ、もう一つは要素ごとの別々な属性が属する (上の例で attr) とこ。かなーりややこしい！</p>
        </del>
        <ins datetime="2004-12-19T14:41:08+09:00">
          <p>partition の種類は三つ。一つは要素が属する partition で、これは特に問題にならないでそのまんま。属性は残りの二つのどちらかに属するんだけどこれが面倒くさい。違いは名前空間にグローバルかローカルか。接頭辞をつける属性は名前空間にグローバル。接頭辞をつけない属性は<em>要素名を経由する</em> (ローカル)。たぶんこれは展開された名前とかを見るとわかりやすいと思う。</p>
          <dl title="属性名の展開。接頭辞は上の例">
            <dt><code class="XML">&lt;f:far attr="ex"/&gt;</code> の attr="ex"</dt>
            <dd>{http://example.com/foo}far@attr</dd>
            <dd>f:far に属している attr という感じ。 far を経由して認識 (っていうのかな) される。</dd>
            <dt><code class="XML">&lt;b:bar f:attr="ex"/&gt;</code> の f:attr="ex"</dt>
            <dd>{http://example.com/foo}@attr</dd>
            <dd>b:bar は関係なく、名前空間 <abbr title="Uniform Resource Identifer | Universal Resource Identifer">URI</abbr> がそのまま属性の名前にくっつく</dd>
          </dl>
          <p>接頭辞をそのまま名前空間の <abbr title="Uniform Resource Identifer | Universal Resource Identifer">URI</abbr> に置き換える (ようは展開することなんだけど) だけでだいぶイメージしやすいと思う。</p>
        </ins>
        <p>一般的な <abbr title="Extensible Markup Language">XML</abbr> では (<abbr title="Extensible Hyper Text Markup Language">XHTML</abbr> とかじゃなくて) 普通接頭辞をつけることになりそう？ この辺わかってない。むしろ要素ごとに別々の意味をもつ要素を定義できるかっつうとできないような。</p>
        <ul title="読んだ">
          <li>
            <a href="http://www.kanzaki.com/docs/sw/names.html">XML名前空間の簡単な説明</a>
          </li>
          <li>
            <a href="http://www.atmarkit.co.jp/fxml/ddd/ddd001/ddd001-namespaces1.html">XML名前空間の落とし穴</a>
          </li>
          <li>
            <a href="http://www.y-adagio.com/public/standards/tr_xml_ns/annexa.htm#ns-breakdown">XML-NS Main Spec.</a>
          </li>
        </ul>
        <ins datetime="2004-12-04T13:45:16+09:00">
          <p>バカすぎるスペルミスを修正。</p>
          <p>気になっていたことを一つ試したのでメモ。<code class="XML">&lt;f:foo f:attr="a1" attr="a2"/&gt;</code> としたときエラーになるか、ということと、実際 <abbr title="XML Path language">XPath</abbr> からはどちらにもアクセスできるのかということ。結果的にはエラーにならないし、<abbr title="XML Path language">XPath</abbr> からはどちらにもアクセスできる。<code class="XPath">f:foo/@f:attr = 'a1'</code>, <code class="XPath">f:foo/@attr = 'a2'</code></p>
        </ins>
        <ins datetime="2004-12-05T17:40:39+09:00">
          <p><abbr title="Extensible Markup Language">XML</abbr> Schema についてで <a href="http://www.horobi.com/xml/XMLSchemaDosAndDONTs.ja.html#avoid_attribute">なぜ属性宣言を避けるべきか</a> ってのがあった。これは <abbr title="Extensible Markup Language">XML</abbr> 名前空間の partition を理解していればひっかかりにくい (ひっかかっても直ぐに気付ける) とこだなぁ。</p>
        </ins>
      </div>
    </content>
  </entry>
</feed>
