59308


仕事でほぼ初めてXMLからHTMLを作成するスタイルシートを作っています．HTMLといっても拡張子は`.php`で中にサーバー側で処理させるようPHPの処理命令をいろいろ埋め込まなければなりません．以下はその例です．

[code]

    <?php includeInnerHtml('c_19.php');?>
    
[/code]

ところがXSLTプロセッサのSaxonで上記のような処理命令を出力しようとすると、上手くいってくれません．例えば

[code]

    <xsl:processing-instruction name="php">includeInnerHtml('C_19.php');</xsl:processing-instruction>
    
[/code]

と書くと、

[code]

    <?php includeInnerHtml('c_19.php');>
    
[/code]

のように出てしまい、最後が`?>`で閉じてくれません．  
これはSaxonのバグではないかと思って報告したのが以下です．

PI output bug in @method="html"  
<https://saxonica.plan.io/issues/4321>

ご覧いただくとわかりますが、Kay博士の見解は、バグではなく元々のHTMLの仕様に基づくものだそうです．確かにHTML
4.01の仕様ではそうなっていました！

B.3.6 Processing Instructions  
<https://www.w3.org/TR/html401/appendix/notes.html#h-B.3.6>

> A processing instruction begins with <? and ends with >

しかしXML仕様では処理命令は以下のようなBNFで表され、明らかに`?>`で終わります．

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'))

なぜHTMLとXMLでは処理命令の書き方にこのような乖離が生まれてしまったのでしょうか？

御存知の方おられましたらご教示ください．

以上 よろしくお願いいたします．


CC BY-SA 4.0
2019-09-26T15:45:06.757
59306
2019-09-26T23:49:56.510
9503
question
php html xml xslt
HTMLにおける処理命令


TL;DR  
XMLはHTMLではないですし、HTMLはXMLではないので、違いがあるのは仕方がありません。XSLTでPHP処理命令を生成するなら、最後に'?'を足してみてはどうでしょう。

`<xsl:processing-instruction
name="php">includeInnerHtml('C_19.php');?</xsl:processing-instruction>`

* * *

  
HTMLは元はSGMLで構築されたマークアップ言語で、処理命令の終端はSGMLのデフォルトである`>`をそのまま適用しています。現在のHTMLはSGMLではありませんが、互換性のため依然として終端は`>`です。

XMLはSGMLで構築されたマークアップ言語で、処理命令の終端は`?>`と定義されています。XMLのためのSGML文法定義で「`DELIM PIC
"?>"`が指定されている」ということです。

デフォルトの`>`から変更した理由は見つけられませんでしたが、処理命令のなかでは特殊文字をエスケープする一般的な方法がなく、「処理命令に`>`を入れられない」よりは「処理命令に`?>`を入れられない」のほうが制限がかなり緩和されるからではないかと推量します。


CC BY-SA 4.0
2019-09-26T23:49:56.510
59308
2019-09-26T23:49:56.510
3475
59306
answer