在<xsl:output>中使用xml、html或xhtml,哪个更好?

10

由于历史原因,我们混合了

<xsl:output method="xml">

并且

<xsl:output method="html">

<xsl:output method="xhtml">

我们在一个XSL文件的包含层次结构中。现在,我们想要重构代码,使所有的XSL文件都使用相同的输出方法。

最终我们想要生成XHTML输出,因此我认为后者是最好的选择。

但是这三种输出方法之间有什么区别?你会在什么样的解决方案中使用它们?

编辑:我正在使用XSLT 2.0

3个回答

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。


6
我通过阅读XSLT 2.0规范(XSLT 2.0和XQuery 1.0序列化)找到了答案。
给定一个内容模型不是EMPTY的XHTML元素的空实例(例如,一个空标题或段落),序列化程序不能使用最小化形式。也就是说,它必须输出

而不是


给定一个内容模型为EMPTY的XHTML元素,序列化程序必须使用最小化标签语法,例如
,因为XML允许的另一种语法

在许多现有的用户代理中会产生不确定的结果。序列化程序必须在尾部/>之前包含一个空格,例如

Karen
序列化程序不能使用实体引用&apos;,虽然这在XML中合法,在XHTML中也是合法的,但在HTML中是未定义的,并且并非所有的HTML用户代理都能识别。
如果可能,序列化器应以符合XHTML DTD要求的方式输出命名空间声明。XHTML 1.0 DTD要求xmlns="http://www.w3.org/1999/xhtml"声明出现在html元素上,而且仅出现在html元素上。序列化程序必须输出与结果树中存在的命名空间节点一致的命名空间声明,但必须避免在DTD将其无效的元素上输出冗余的命名空间声明。
这意味着答案是使用<xsl:output method="xhtml">

1
这没有意义:XHTML 不用担心在没有空内容模型的情况下使用自闭合,但 HTML 解析器会有一些问题。 - Milind R

4
据我所知,在xslt 1.0中,xsl:output指令没有method:xhtml选项。 wc3schools也认同这一点。
由于XHTML是XML方言,因此我会使用它。
但是,如果您正在使用xslt 2.0,那么最好使用xhtml,因为这就是您要输出的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接