由于历史原因,我们混合了
<xsl:output method="xml">
和
<xsl:output method="html">
和
<xsl:output method="xhtml">
在 XSL 文件的包含层次结构中。现在我们要重构,以便所有 XSL 文件使用相同的输出方法。
最后,我们想要生成 XHTML 输出,所以我认为后者将是最佳选择。
但是这三种输出方法之间有什么区别,你会使用哪种解决方案呢?
编辑:我正在使用 XSLT 2.0
HTML 将序列化为 HTML,因此输出可能不是格式良好的 XML。如果您只是发送到浏览器并且不关心能够解析为 XML,那么这可能对您有用。
XML 将序列化为 XML,因此输出格式正确,但使用输出的浏览器可能会遇到一些问题。小东西,比如自动关闭<script />
和<div />
元素。为了避免这个问题,你必须玩游戏,比如在元素内添加评论(例如<script src="someJSFile.js"><!--don't close my script tag --></script>
)
如果您有一个 XSLT 2.0 引擎并且想要格式良好的 HTML 输出,而不必担心某些元素是如何序列化的,那么请使用 XHTML。
我通过阅读 XSLT 2.0 规范( XSLT 2.0 和 XQuery 1.0 序列化)找到了答案。
给定内容模型不是 EMPTY 的 XHTML 元素的空实例(例如,空标题或段落),序列化程序不得使用最小化形式。也就是说,它必须输出
<p></p>
而不是<p />
.给定一个内容模型为 EMPTY 的 XHTML 元素,序列化程序必须使用最小化的标记语法,例如,因为XML 允许
<br />
的替代语法在许多现有用户代理中给出了不确定的结果。<br></br>
序列化程序必须在结尾的 /> 之前包含一个空格,例如<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">
.
据我所知,xslt 1.0 中没有method:xhtml
该xsl:output
指令。
wc3schools同意这一点。
因为 XHTML 是一种 XML 方言,所以我会使用它。
但是,如果您使用的是xslt 2.0,不妨使用xhtml
,因为这就是您要输出的内容。