XML文档含<字符时XSLT处理异常及内嵌HTML的解决问询
问题解决方案
核心问题根源
XML解析器会先于XSLT处理完成所有实体引用解析:
&gt;会被解析为>,这是XML元素内容中的合法字符,因此无报错&lt;会被解析为<,而XML元素内容里的<若不属于标签的一部分,属于非法字符,直接触发解析错误,无法进入XSLT处理流程
具体解决步骤
1. 修正XML源文件的实体转义
- 要在XML元素内容中包含
<,直接使用<转义,而非&lt;:
错误写法:
正确写法:<artist>Bob &lt; Dylan</artist><artist>Bob < Dylan</artist> - 内嵌HTML场景同理,直接使用XML合法转义:
错误写法:
正确写法:<artist>&lt;b&gt;Bob&lt;/b&gt; &lt; Dylan</artist><artist><b>Bob</b> < Dylan</artist>
2. XSLT中正确使用disable-output-escaping
当XML源已完成正确转义后,使用disable-output-escaping="yes"即可保留原始符号或HTML标签:
<xsl:value-of select="artist" disable-output-escaping="yes" />
该写法会将XML解析后的内容(如<b>Bob</b> < Dylan>)直接输出,不会再次转义为<b>Bob</b> < Dylan。
3. XSLT字符串常量的正确写法
在XSLT中直接编写包含<的字符串时,需要在XSLT文件中用&lt;转义(因为XSLT本身也是XML文件):
错误写法:
<xsl:value-of disable-output-escaping="yes" select="string('ab<cd')"/>
正确写法:
<xsl:value-of disable-output-escaping="yes" select="string('ab&lt;cd')"/>
这样XSLT解析后字符串内容为ab<cd>,开启disable-output-escaping后可正常输出。
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

