1

XSLT 変換 (サーバー側、php) を実行しようとしていますが、XHTML ページの一部であるため、その変換の出力として XHTML が必要です。私が使用する場合

    <xsl:output method="html" /> 

有効な html コードであるコードを生成しますが、br タグ (/ なし) があるため、xhtml として検証されません。

私が使用する場合

    <xsl:output method="xml" /> 

ここに不条理があります: 出力には br/ タグがあり、適切な xml がありますが、それが属するページにそれを配置すると、明確な理由もなく一部の終了タグが消えます。

ここに XSL ファイルがありますhttp://hbxplayer.sf.net/test/mobile.xsl (ここに貼り付けるには少し長いです)

変換を行う PHP は次のとおりです。

    ob_start();
    include 'presetList_xml.php';
    $xml=ob_get_clean();
    $xsl=file_get_contents("mobile.xsl");
    $xslt=new XSLTProcessor();
    $xslt->importStyleSheet(new SimpleXMLElement($xsl));
    echo $xslt->transformToXml(new SimpleXMLElement($xml));

出力をロードする JS は次のとおりです。

    function loadPresetList(){
        var listArea=document.getElementById("presetsArea");
        var xmlhttp=new XMLHttpRequest();
        xmlhttp.onreadystatechange=function(){
            if(xmlhttp.readyState==4){
                if(xmlhttp.status==200||xmlhttp.status==0){
                        listArea.innerHTML=xmlhttp.responseText;
                }else{ //ERROR, TRY AGAIN
                        listArea.innerHTML="Error. Retrying...";
                        loadPresetList();
                }
            }
        }
        xmlhttp.open("GET","presets_transformer.php?type=mobile&r="+Math.random(),true);
        xmlhttp.send();
    }

ご覧のとおり、特別なことは何もありません。しかし、XSLT を使用するのは初めてなので、何か間違っている可能性があります。

前もって感謝します :)

編集: 各要素の周りに div を配置すると、この問題が解決するようです。なんで?何も思いつきません。まだ: 最初に開いたタグには常に終了タグがありません

4

1 に答える 1

1

XSLT 1.0 プロセッサを使用する場合、通常は出力メソッドとして提供される HTML 4 を生成するか、XML または XHTML を生成して XML MIME タイプで提供されるか、XHTML で提供される出力メソッドのみをサポートhtmlします。 MIME タイプ。ただし、IE の古いバージョン (IE 8 を含む) は、XHTML をサポートしていません。また、特に古いブラウザでは、XHTML にも問題があることが知られています。text/htmlxmlapplication/xmlapplication/xhtml+xmlapplication/xhtml+xmlinnerHTML

XSLT 2.0 には、xhtml提供できる適切な形式の XHTML を生成する出力メソッドtext/htmlがあり、古いブラウザーに送信される XHTML を処理したいという私の見解では、これが適切なオプションです。

XSLT 1.0 のみをサポートする PHP を使用しinnerHTML、XSLT スタイルシートを使用して HTML 4 または HTML 5 を作成し、XHTML を回避することを強くお勧めします。

于 2013-08-13T10:36:50.213 に答える