处理CDATA元素中的HTML实体

时间:2015-05-04 09:27:26

标签: html xml xslt

我目前正在进行XSLT转换,将一些XML文档的结构更改为一个外部服务提供商所需的结构。

我的源文档包含一个非常大的元素,其CDATA内容如下:

<ABC>
        <![CDATA[
        Lorem ipsum dolor sit amet<br><br>
        onsetetur sadipscing elitr, sed diam nonumy eirmod tempor<br>
        At vero eos et &auml;ccusam et justo duo dolores et ea rebum
        ..."LARGE CONTENT"...
        ]]>
</ABC>

请注意,该文字包含未公开的&lt; br&gt;元素和许多不同的HTML实体,如&amp; auml;

我的目标文档中的所需结果应如下所示:

<p>
        Lorem ipsum dolor sit amet<br/><br/>
        onsetetur sadipscing elitr, sed diam nonumy eirmod tempor<br/>
        At vero eos et äccusam et justo duo dolores et ea rebum
        ...&quot;LARGE CONTENT&quot;...
</p>

没有CDATA,&lt; br&gt;元素被关闭了,所以我有很好的XML,HTML实体被转换为UTF字符,如例子中所示:&amp; auml; - &GT; ä
除了您必须为XML转义的实体,例如&lt;,&gt;,“,',&amp;

我处理这个问题的方法:

<xsl:template match="ABC">

    <xsl:variable name="temp" select="replace(text(),'&amp;auml;','ä')"/>

    <!--[... many replacement rules for HTML entities...]-->

    <xsl:value-of select="replace($temp,'&lt;br&gt;','&lt;br/&gt;')" disable-output-escaping="yes"/>

</xsl:template>

这个模板满足了它的要求,但有许多替换规则,它似乎是非常间接和无效的。

有没有更好的方法来处理HTML实体的转义呢?

1 个答案:

答案 0 :(得分:1)

如果要解析HTML或HTML文档的片段并使用Saxon 9(PE或EE)的商业版本,那么它在TagSoup的帮助下提供HTML解析支持,作为扩展函数公开{{1} }(在命名空间saxon:parse-html中,请参阅http://www.saxonica.com/documentation/index.html#!functions/saxon/parse-html),可以在

中调用
http://saxon.sf.net/

或类似处理由<xsl:template match="ABC"> <p> <xsl:apply-templates select="saxon:parse-html(.)/node()"/> </p> </xsl:template> TagSoup解析器创建的节点。