我目前正在进行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 ä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
..."LARGE CONTENT"...
</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(),'&auml;','ä')"/>
<!--[... many replacement rules for HTML entities...]-->
<xsl:value-of select="replace($temp,'<br>','<br/>')" disable-output-escaping="yes"/>
</xsl:template>
这个模板满足了它的要求,但有许多替换规则,它似乎是非常间接和无效的。
有没有更好的方法来处理HTML实体的转义呢?
答案 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
解析器创建的节点。