HTMLとXMLの処理命令

XMLからHTMLへの変換スタイルシートを書いています.「そんなのありふれてるじゃん」と言われそうなんですが、なにせ変換元がDITAなのでそう甘くはないです.

で、HTMLと言っても拡張子は.phpです.つまりサーバー側のPHPエンジンで変換されクライアントのブラウザに送られます.このため、XMLから生成する.phpファイルにはHTML構文だけでなく、"<?php ~ ?>" のPHPの命令を埋め込まねばなりません.

こんなの当たり前のことと思って<xsl:processing-instruction name="php">コンテンツ</xsl:processing-instructuin>で吐き出していました.出力がXML形式の場合はなんの問題もありませんが、HTML形式を指定すると、上手くいってくれません.出力は次のようになってしまい、"?>"で閉じてくれないのです.

 <?php ~ >

 これは使っているXSLTプロセッサのSaxonのバグではないかと思いSaxonicaのバグ報告にポストしたのが以下です.

https://saxonica.plan.io/issues/4321

 Kay博士の言うには、HTMLでは`>`で閉じるのが仕様とのこと!確かにHTML 4.0.1の仕様の該当箇所を見ると以下のように書いてあります.

B.3.6 Processing Instructions

Processing instructions are a mechanism to capture platform-specific idioms. A processing instruction begins with <? and ends with >

 エッ!全然知らなかった!XMLでは次のように書かれていて、間違いなく`?>`で終わるのです.

2.6 Processing Instructions

https://www.w3.org/TR/xml/#sec-pi

[16] PI ::= '<?' PITarget (S (Char* - (Char* '?' Char*)))? '?>'
[17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l'))

 

XMLもHTMLも元はSGMLから生まれてきたものですが、こんなところが違うんですね.恥ずかしながら10数年間XMLをやってきて初めて知りました.それにしてもこの世界はどんどん新しいものが出てくるようで、その実昔の仕様を引きずっていたり、奥の深いものがあります.まだまだ勉強しなければならないと痛感しました. 

※ この件、Stckoverflowに質問して、回答者の方にはお世話になりました.この場を借りてお礼いたします

HTMLにおける処理命令