Atom XML中type="html"内容转义:W3C文档示例是否有误?
关于Atom文档中
type="html"元素转义的疑问与解答 问题背景
W3C Atom文档中有如下说明:
若
type="html",则该元素包含经过实体转义的HTML。<title type="html"> AT&amp;T bought &lt;b&gt;by SBC&lt;/b&gt;! </title>
但我按以下步骤操作后,结果和示例不符:
- 原始文本:
AT&T bought by SBC!
- 对应的HTML形式:
AT&T bought <b>by SBC</b>! - 使用XML转义代码处理该HTML字符串:
const escapeForXML = (st) => st.replaceAll("&", "&") .replaceAll("<", "<") .replaceAll(">", ">"); console.log(escapeForXML("AT&T bought <b>by SBC</b>!")); - 得到的结果:
与文档示例的AT&amp;T bought <b>by SBC</b>!AT&amp;T bought &lt;b&gt;by SBC&lt;/b&gt;!不一致,请问问题出在哪?
问题根源:双重转义的要求
问题出在对Atom文档中「经过实体转义的HTML」的理解——它要求的是双重转义,而你的代码只完成了单次转义,拆解步骤如下:
第一步:转义为合法HTML
原始文本AT&T bought by <b>SBC</b>!需要先转义成HTML格式:&转义为&,得到AT&T bought <b>by SBC</b>!(HTML标签<b>保留,因为这是HTML的一部分)
第二步:转义为XML文本内容
因为Atom是XML格式,当你把这段HTML放到XML元素中时,需要把整个HTML字符串当作XML的普通文本进行转义:- 对HTML里的
&再次转义:AT&T中的&会变成&amp;,即AT&amp;T - 对HTML里的
<和>转义:<b>中的<先转成<,而<里的&还要再转成&,最终变成&lt;;同理>转成&gt;,所以<b>最终变成&lt;b&gt;
- 对HTML里的
你的代码只完成了第二步的转义,而文档示例是完成了两次转义后的结果,所以两者不一致。
简单来说:Atom的type="html"元素需要的是「HTML转义后的字符串,再经过一次XML转义」,也就是双重转义,你少做了一次对HTML标签本身的转义前置步骤。
内容的提问来源于stack exchange,提问作者mb21
相关产品推荐
相关产品推荐

