我正在尝试进行 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 似乎可以解决这个问题。为什么?我不知道。尽管如此:打开的第一个标签总是缺少结束标签
最佳答案
如果您想使用 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 的 PHP 和 innerHTML
的使用,我强烈建议使用 XSLT 样式表创建 HTML 4 或 HTML 5,并避免使用 XHTML。
关于php - XSLT 转换搞砸了 <br/> 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18206662/