XML CDATA中的HTML被转换为<和>括号

时间:2010-11-30 13:38:19

标签: xml xslt asp-classic cdata

我有一些示例XML:

<sample><![CDATA[Line 1<br />Line 2<br />Line 3<br />]]></sample>

我正在使用ASP来输出这个XML,使用类似这样的样式表:

Set xmlHttp = Server.CreateObject("Microsoft.XMLHTTP")
xmlHttp.open "GET", URLxml, false
xmlHttp.send()

Set xslHttp = Server.CreateObject("Microsoft.XMLHTTP")
xslHttp.open "GET", xXsl, false
xslHttp.send()   

Set xmlDoc = Server.CreateObject("MICROSOFT.XMLDOM")
Set xslDoc = Server.CreateObject("MICROSOFT.XMLDOM")
xmlDoc.async = false
xslDoc.async = false
xmlDoc.Load xmlHttp.responseXML
xslDoc.Load xslHttp.responseXML

Response.Write xmlDoc.transformNode(xslDoc)

但是,一旦编写完成,HTML输出就会显示为:

Line 1&lt;br /&gt;Line 2&lt;br /&gt;Line 3

我可以看到ASP正在转换代码中的括号,但我不确定原因。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

  

我有一些示例XML:

<sample><![CDATA[Line 1<br />Line 2<br />Line 3<br />]]></sample>

这是一个sample元素,其中包含文本节点子元素。

假设您应用了身份转换。然后结果将是:

<sample>Line 1&lt;br /&gt;Line 2&lt;br /&gt;Line 3&lt;br /&gt;</sample>

为什么呢?由于文本节点和属性值具有特殊字符&<>将转义为字符实体。

编辑:当然,您可以使用DOE ......但是,除了它是一个可选功能之外,结果将是一个文本节点,无论如何(没有编码字符实体)。您将需要其他解析器fase(这可能在输出和编码HTML片段到(X)HTML文档时很有用,例如在feed中,存在输出格式错误的风险......)。

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="sample">
        <p>
            <xsl:value-of select="." disable-output-escaping="yes"/>
        </p>
    </xsl:template>
</xsl:stylesheet>

输出:

<p>Line 1<br />Line 2<br />Line 3<br /></p>

渲染为(实际标记):

第1行第2行第3行

答案 1 :(得分:1)

除了@Alejandro的解释,这是最好的解决方案:

永远不要将标记放在文本(CDATA)节点

而不是:

<sample><![CDATA[Line 1<br />Line 2<br />Line 3<br />]]></sample>

始终创建:

<sample>Line 1<br />Line 2<br />Line 3<br /></sample>

记住:将标记置于CDATA内部正在失去它。

答案 2 :(得分:1)

认为这是导致问题的XSL转换。您应该能够编辑.xsl文档以进行更正:

<xsl:template match=".">
  <xsl:value-of select="." disable-output-escaping="yes" />
  <!-- ... other XSL business here ... -->
</xsl:template>

我是从this page about disable output escaping窃取的。

对于记录我讨厌XML / XSL - 一种寻找问题的解决方案。一般来说,如果你需要处理标记,我发现XML / XSL只会引入问题,因为你经常需要处理标记片段,这些片段通常都不是有效的XML,因此你将CDATA包裹起来然后随着时间的推移而欢呼经历。

<强>更新

好的,所以上面没有用。当然,在添加问题评论之前,不知道XSL是什么样的。以下工作(来自this forum thread的想法):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:template match=".">
        <xsl:value-of select="sample"  />
    </xsl:template>
</xsl:stylesheet>

键是<xsl:output method="text" />

此外,对于投票,请评论原因。