XSLT 2.0で便利になった機能(34) デフォルトネームスペース

いまやXMLはどこもかしこも(?)XMLはネームスペースの世界です.あのDocBookもネームスペースが導入されています.DocBookのインスタンスを作成するとき、たぶん次のようにデフォルトネームスペースとして"http://docbook.org/ns/docbook"を指定するでしょう.
 
<?xml version="1.0" encoding="UTF-8" ?>
<book xmlns="http://docbook.org/ns/docbook">
    <chapter>
        <para>DocBook Sample</para>
    </chapter>
</book>
 
DTDを <!DOCTYPE book SYSTEM 'docbook.dtd'> のように指定するとパーサーを通過させれば黙っていてもxmlns="http://docbook.org/ns/docbook"がつきます.それはDTDで次のように定義されているからです.
 
<!ATTLIST book
    xmlns    CDATA    #FIXED    "http://docbook.org/ns/docbook"
    role    CDATA    #IMPLIED
    %db.common.attributes;
    %db.common.linking.attributes;
    label    CDATA    #IMPLIED
    status    CDATA    #IMPLIED
>
 
さて、デフォルトネームスペースを指定したXMLインスタンスに対するスタイルシートを書くとします.誰もがたぶん一回は間違えるのは、次のようなスタイルシートを書いてしまうことではないでしょうか?
 
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="http://docbook.org/ns/docbook">
<xsl:template match="book">
    ...
</xsl:template>
 
実はどうしてもこれ動いてくれません.match="book"はマッチしてくれないのです.XSLT 1.0では次のように書くしかありません.
 
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:db="http://docbook.org/ns/docbook">
<xsl:template match="db:book">
    ...
</xsl:template>
 
XSLT1.0では、XPath式の中ではデフォルトネームスペースは、使えないとされているからです.
しかしいちいちprefixをつけるのは面倒です.XSLT2.0では、xpath-default-namespace属性というのが使えて、
 
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xpath-default-namespace="http://docbook.org/ns/docbook">
<xsl:template match="book">
    ...
</xsl:template>
 
とすると、XPath式の中のデフォルトネームスペースURIは"http://docbook.org/ns/docbook"となり、このスタイルシートは期待通りに動くようになります.覚えておいて損はありませんね.