いまや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>
<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
>
xmlns CDATA #FIXED "http://docbook.org/ns/docbook"
role CDATA #IMPLIED
%db.common.attributes;
%db.common.linking.attributes;
label CDATA #IMPLIED
status CDATA #IMPLIED
>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://docbook.org/ns/docbook">
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://docbook.org/ns/docbook">
<xsl:template match="book">
...
</xsl:template>
...
</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">
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:db="http://docbook.org/ns/docbook">
<xsl:template match="db:book">
...
</xsl:template>
...
</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">
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="http://docbook.org/ns/docbook">
<xsl:template match="book">
...
</xsl:template>
...
</xsl:template>
とすると、XPath式の中のデフォルトネームスペースURIは"http://docbook.org/ns/docbook"となり、このスタイルシートは期待通りに動くようになります.覚えておいて損はありませんね.