<xsl:output>中的xml,html或xhtml:哪个是更好的选择?

B.E*_*.E. 8 xml xslt xslt-2.0

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

<xsl:output method="xml">
Run Code Online (Sandbox Code Playgroud)

<xsl:output method="html">
Run Code Online (Sandbox Code Playgroud)

<xsl:output method="xhtml">
Run Code Online (Sandbox Code Playgroud)

在包含XSL文件的层次结构中.现在我们想重构所以所有XSL文件都使用相同的输出方法.

最后我们想要生成XHTML输出,所以我认为后者是最好的选择.

但是这三种输出方法之间有什么区别,你会用哪种解决方案?

编辑:我正在使用XSLT 2.0

Mad*_*sen 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.


B.E*_*.E. 5

我通过阅读XSLT 2.0规范(XSLT 2.0和XQuery 1.0 Serialization)找到了答案.

给定内容模型不是EMPTY的XHTML元素的空实例(例如,空标题或段落),序列化器不得使用最小化形式.也就是说,它必须输出<p></p>而不是<p />.

给定其内容模型为EMPTY的XHTML元素,序列化器必须使用最小化的标记语法,例如<br />,因为<br></br>XML允许的替代语法在许多现有用户代理中给出不确定的结果.串行化器必须包括前尾随/>,例如一个空格<br />,<hr /><img src="karen.jpg" alt="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">.