通过xsl:value-of select将HTML插入CDATA部分

时间:2013-03-17 21:29:23

标签: xml xslt xslt-1.0 cdata

我有一个包含HTML标记的源XML。它是从一个笨拙的CSV文件创建的。

目标是将源XML转换为第二个XML 使用以下内容,

<Description type="long" format="html">
  <![CDATA[             
    <xsl:value-of select="HTML_Descr"/>
 ]]>
</Description>

不幸的是,XSL转换如下

<Description type="long" format="html">
  <![CDATA[             
    &lt;xsl:value-of select="HTML_Descr"/&gt;
 ]]>
</Description>

输出对反射有意义,但目标只是将HTML包装在CDATA中。

注意: - 无法将CDATA放入源XML中。 - 更准确地说,源XML文件是100个XML文件 - 处理器是xsltproc,使用XSL 1.0

对不起。发现的大量帮助只是保留HTML格式。 提前谢谢。

附录

完整的过程是 CSV - &gt; XML(使用CSV标头的临时翻译) - &gt; XML(好) - &gt; (X)HTML。

HTML无法从临时XML转换,因为良好的XML在存储库中维护 - 并且持续更新。

2 个答案:

答案 0 :(得分:4)

实际上这是最接近的问题,Convert 'embedded' XML doc into CDATA output in XSLT (1.0)

回答:

以下功能可以根据需要进行,但它可能不是唯一且最佳的解决方案。

<xsl:template match="document">
  <document>
    <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
    <xsl:copy-of select="./html"/>
    <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
  </document>
</xsl:template>

答案 1 :(得分:0)

你可能想要这个:

<xsl:value-of select="HTML_Descr" disable-output-escaping="yes"/>

但请注意,如果CDATA中的HTML片段不是正确的XML(例如XHTML),这可能会导致XML文件无效。 谨慎使用 - 这是一种强烈的代码味道!

更好的方法是将HTML作为真正的XHTML放在XML文件中的自己的命名空间中,而不是使用CDATA文本文本块,这样您就可以让XSLT处理器复制节点而不是使用{{1} “黑客”。