DOCTYPE宣言とxmlnsがあるとXHTML to XHTMLのXSLT変換がうまくいかない件

発端は質問掲示板のWeb一般 [18848] XHTMLにXSLTの適用*1
いろいろ問題があるなぁと思いつつも実際に試してみたらうまくいかない。

DOCTYPE,xmlnsがあると...

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="xslt_test.xsl"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<title>XML: XSLT TEST</title>
</head>
<body>
<h1>XSLT TEST</h1>
<p>hogehoge</p>
</body>
</html>
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml">
<xsl:output method="html" encoding="utf-8" media-type="text/html"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"/>

<xsl:template match="/">
<html>
<head>
<title>XSL TEST</title>
</head>
<xsl:apply-templates select="/html/body"/>
</html>
</xsl:template>

<xsl:template match="body">
<body>
<h1><xsl:value-of select="h1"/></h1>
<p><b><xsl:value-of select="p"/></b></p>
</body>
</xsl:template>

</xsl:stylesheet>

で、xalanで変換すると

$ java org.apache.xalan.xslt.Process -in xslt_test.xml -xsl xslt_test.xsl
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>XSL TEST</title>
</head>
</html>

の通り。templateのmatchが適応されてない雰囲気。

DOCTYPE,xmlnsが無いと...

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="xslt_test.xsl"?>
<html>
<head>
<title>XML: XSLT TEST</title>
</head>
<body>
<h1>XSLT TEST</h1>
<p>hogehoge</p>
</body>
</html>
xslファイルは同じなので割愛。

$ java org.apache.xalan.xslt.Process -in xslt_test.xml -xsl xslt_test.xsl
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>XSL TEST</title>
</head>
<body>
<h1>XSLT TEST</h1>
<p>
<b>hogehoge</b>
</p>
</body>
</html>

の様にうまく行く。
Firefoxではxmlnsが無いだけでDOCTYPEがあっても大丈夫だが。xalanで失敗時と同様の結果となる。

仕様をチェキ

落とし穴の予感...ってことで仕様をチェックしに行く。

NOTE:This DTD Fragment is not normative because XML 1.0 DTDs do not support XML Namespaces and thus cannot correctly describe the allowed structure of an XSLT stylesheet.

何か違う気もするが、この辺りが関係しているのだろうか...。

*1:因みに"ヤン"は私のハンドルネーム