さーて前回はXMLの中での名前空間の扱いをしらべた。
こういうXMLを考えよう。
<A><B>Bの中身</B></A>
このXMLをvalue-ofすることを考えてみよう。
<xsl:value-of select="/A/B" />
これでBの中身にアクセスできる。
では名前空間定義済みの場合にはどうなるのであろうか。
<A xmlns="http://www.example.com/tatoeba">
<B>Bの中身</B>
</A>
<xsl:value-of select="/A/B" xmlns="http://www.example.com/tatoeba" />
上記のXMLとXSLの組み合わせを展開してみよう。
<http://www.example.com/tatoeba_A>
<http://www.example.com/tatoeba_B>Bの中身
</http://www.example.com/tatoeba_B>
</http://www.example.com/tatoeba_A>
<xsl:value-of select="/A/B" />
XMLの方は想像したとおりに展開されるのに、XSLのほうには展開されていない。
XSLもXML文書であるという点を考えてほしい。
以下のようなXSLが合ったとしよう。
<xsl:value-of select="/A/B" xmlns="http://www.example.com/tatoeba">
<A />
</xsl:value-of>
このようなXSLであれば
<xsl:value-of select="/A/B">
<http://www.example.com/tatoeba_A />
</xsl:value-of>
このように展開されるものだろう。
なぜXSL命令の中で展開されないのかを考えると、実は1つの結論しか出てこない。
名前空間なしXMLに対してアクセスする方法がなくなってしまうからだ。
名前空間のないシンプルなXMLが合った場合にアクセスできないのではXSLは大きな欠陥呼ばわりされてしまう事間違いなしである。
なのでXSL(プログラムでも同様)で名前空間を定義したXMLを操作する場合には
<xsl:value-of select="/the:A/the:B" xmlns:the="http://www.example.com/tatoeba">
<A />
</xsl:value-of>
と利用する。
わかっていただけただろうか。
XMLを利用する際に名前空間はきっても切れないものなので、確実に理解してほしい。
次回からは本流に戻って中級編の開始です。