今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の仕様の該当箇所を見ると以下のように書いてあります.
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に質問して、回答者の方にはお世話になりました.この場を借りてお礼いたします