【发布时间】:2010-06-15 09:47:18
【问题描述】:
由于 disable-output-escaping 在 firefox 上不起作用(也不会起作用),在 XSTL 转换的输出中包含原始标记的下一个最佳方法是什么?
(背景:我在数据库中有原始 HTML,我想将其包装在 XML 中以发送到浏览器进行渲染。我可以控制 XML 和样式表,但无法控制 HTML,可能格式不正确(即使对于 HTML!))
谢谢
【问题讨论】:
由于 disable-output-escaping 在 firefox 上不起作用(也不会起作用),在 XSTL 转换的输出中包含原始标记的下一个最佳方法是什么?
(背景:我在数据库中有原始 HTML,我想将其包装在 XML 中以发送到浏览器进行渲染。我可以控制 XML 和样式表,但无法控制 HTML,可能格式不正确(即使对于 HTML!))
谢谢
【问题讨论】:
您可以将违规文本放在 CDATA 部分中。
例如,这是一个格式良好的 XML 文档:
<t><![CDATA[M & M < sufficient]]></t>
这是一个 XSLT 转换,它将所选元素 (<t>) 的文本节点放在 CDATA 部分中:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" />
<xsl:output cdata-section-elements="t"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
结果是:
<t><![CDATA[M & M < sufficient]]></t>
如果没有<xsl:output cdata-section-elements="t"/> 指令,结果将是:
<t>M & M < sufficient</t>
【讨论】:
XSLT 不是关于标记,而是关于树。
在 XSLT1 中,您不能接受格式错误的输入。在 XSLT2 中你可以,但你当然会失去 xpath 导航。
因此,如果没有“禁用输出转义”机制,您将无法输出可能格式错误的树。这是一个功能!
【讨论】: