由于历史原因,我们混合了
<xsl:output method="xml">
和
<xsl:output method="html">
和
<xsl:output method="xhtml">
在XSL文件的包含层次结构中。现在我们想重构所以所有XSL文件都使用相同的输出方法。
最后我们想要生成XHTML输出,所以我认为后者是最好的选择。
但是这三种输出方法之间有什么区别,你会用哪种解决方案?
编辑:我正在使用XSLT 2.0
答案 0 :(得分:8)
HTML将序列化为HTML,因此输出可能不是格式良好的XML。如果您只是发送到浏览器而不关心能够解析为XML那么这可能对您有用。
XML将序列化为XML,因此输出结构良好,但是使用输出的浏览器可能会遇到一些问题。小事情,例如自我关闭<script />
和<div />
元素。为了避免这个问题,你必须玩游戏,比如在元素中添加注释(例如<script src="someJSFile.js"><!--don't close my script tag --></script>
)
如果您有一个XSLT 2.0引擎并且想要格式良好的HTML输出而不必担心某些元素如何被序列化,那么请使用XHTML。
答案 1 :(得分:5)
我通过阅读XSLT 2.0规范(XSLT 2.0 and XQuery 1.0 Serialization)找到了答案。
给出一个XHTML的空实例 内容模型不是的元素 EMPTY(例如,空标题或 段)序列化器不得使用 最小化的形式。也就是说,它必须 输出
<p></p>
而非<p />
。给定一个XHTML元素的内容 model是EMPTY,序列化器必须 使用最小化标记语法 示例
<br />
,作为替代方案 XML允许的语法<br></br>
许多人给出了不确定的结果 现有用户代理。序列化器 必须在前面加一个空格 尾随/&gt;,例如<br />
,<hr />
和<img src="karen.jpg" alt="Karen" />
。序列化器绝不能使用该实体 尽管参考
'
在XML中合法,因此在XHTML中, 没有在HTML中定义,也没有 被所有HTML用户代理识别。序列化程序应该输出命名空间 声明的方式是 符合要求 如果可能的话,XHTML DTD。该 XHTML 1.0 DTD需要声明 的xmlns = “http://www.w3.org/1999/xhtml” 出现在html元素上,和 仅限于html元素。该 序列化器必须输出命名空间 与...一致的声明 存在于中的命名空间节点 结果树,但它必须避免 输出冗余命名空间 DTD元素的声明 会使它们无效。
这意味着答案是使用<xsl:output method="xhtml">
。
答案 2 :(得分:3)
据我所知,xslt 1.0中的method:xhtml
指令没有xsl:output
。
wc3schools同意这一点。
由于XHTML是一种XML方言,所以我会使用它。
如果您使用的是xslt 2.0,请使用xhtml
,因为这就是您要输出的内容。