XSLT Transform拧紧了标签

时间:2013-08-13 10:27:19

标签: php javascript html xml xslt

我正在尝试进行XSLT转换(服务器端,使用php),我希望XHTML作为该转换的输出,因为它是XHTML页面的一部分。 如果我使用

    <xsl:output method="html" /> 

它生成的代码是有效的html代码,但是有br标签(没有/)所以它不会验证为xhtml;

如果我使用

    <xsl:output method="xml" /> 

这里出现了荒谬:输出确实有br /标签,并且IS适当的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似乎可以解决这个问题。为什么?我不知道。仍然:打开的第一个标签总是缺少结束标签

1 个答案:

答案 0 :(得分:1)

如果您想使用XSLT 1.0处理器,那么它通常只支持输出方法html生成HTML 4以作为text/html或输出方法xml来生成XML或者XHTML使用XML MIME类型(如application/xml)提供,或者与XHTML MIME类型application/xhtml+xml一起提供。然而,较旧的IE版本(包括IE 8)不支持作为application/xhtml+xml的XHTML。众所周知,innerHTML也存在XHTML问题,特别是在旧浏览器中。

XSLT 2.0有一个输出方法xhtml来生成结构良好的XHTML,可以作为text/html使用,在我看来你想要处理要发送的XHTML时,这是正确的选择对于较旧的浏览器。

鉴于您使用仅支持XSLT 1.0并使用innerHTML的PHP,我强烈建议让XSLT样式表创建HTML 4或HTML 5并避免使用XHTML。