在CDATA文本中解析HTML

时间:2013-04-18 15:14:56

标签: xslt xslt-1.0

CDATA内的数据将被解析为Html。

<?xml version="1.0" encoding="utf-8" ?>
<test>
  <test1>
    <![CDATA[ &lt;B&gt; Test Data1 &lt;/B&gt; ]]>
  </test1>

  <test2>
    <![CDATA[ &lt;B&gt; Test Data2 &lt;/B&gt; ]]>
  </test2>

  <test3>
    <![CDATA[ &lt;B&gt; Test Data3 &lt;/B&gt; ]]>
  </test3>
 </test>

从Above输入xml我需要将输出解析为html。

但我得到的输出为

<B>Test Data1</B>
<B>Test Data2</B>
<B>Test Data3</B>

但实际输出我需要文本以粗体显示。

**Test Data1
Test Data2
Test Data3**

输入来自外部系统。我们无法更改CDATA内的文本

2 个答案:

答案 0 :(得分:1)

只能使用扩展函数(或使用XSLT 2.0和使用XSLT 2.0编写的HTML解析器)解析HTML,但是如果要创建HTML输出并希望将testX元素的内容输出为HTML然后你可以用例如

来做到这一点
<xsl:template match="test/*[starts-with(local-name(), 'test')]">
  <xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:template>

但请注意,disable-output-escaping是所有用例中所有XSLT处理器都不支持的可选序列化功能。例如,在Mozilla浏览器中使用客户端XSLT时,它不受支持。

答案 1 :(得分:0)

如果您必须继续使用XSLT 1.0,则必须运行两次转换过程。

  1. 首先复制xml,但通过使用disable-output-escaping =&#34; yes&#34;生成内容来删除CDTA。 (见@Martin Honnen的回答)

  2. 在第二个路径中,您可以访问html部分。

  3. 但是,如果html部分遵循格式良好的xml(xhtml)的角色,这可能是唯一可能的。如果不是,xsltproc中的输入开关可能有助于使用html,例如:

     --html: the input document is(are) an HTML file(s)
    

    另请参阅:Convert an xml element whose content is inside CDATA