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"?>で、xalanで変換すると
<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>
$ 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"?>xslファイルは同じなので割愛。
<?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>
$ 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:因みに"ヤン"は私のハンドルネーム