XML中使用的CDATA是XML解析器未解析的(多字符转义序列).一致地,当我们使用CDATA定义属性时;解析器不应该解析它.但是,确实如此!
那么,为什么不能使用PCDATA代替CDATA来定义属性?
更新 – 这一直保持与SGML向后兼容. SGML中这种命名背后的原因是什么?
乍一看,这似乎是武断的,但事实并非如此(见here和here).
在SGML中,可以引用属性值规范(属性值文字)或不引用(属性值).
attribute value specification = attribute value literal | attribute value
当该属性不加引号时,只允许使用NAME字符,并且可能会对某些声明的值(如NUMBER)进一步限制.
另一方面,属性值文字的内容是由LIT / LITA分隔符(在参考具体语法中分别为双引号和单引号)包围的可替换字符数据的序列.
attribute value literal = ( LIT,replaceable character data *,LIT) | ( LITA,LITA)
可替换的字符数据“就像CDATA一样,除了实体引用和字符引用被识别”(Goldfarb,SGML手册).
因此,属性值文字中实体引用的替换不依赖于属性的声明值.因此,如果你有<!ENTITY foo“bar”>和< elem attr =“& foo;”>实体参考& foo;将在可替换字符数据(LIT识别模式)的上下文中解析,产生< elem attr = bar>.如果attr被声明为CDATA,NAME或其他什么并不重要.
更新
没有必要说必须解析属性中的实体,因为所有属性类型都具有相同的解析规则:如果属性值以引用(LIT)开头,则识别实体(可替换字符数据)和值找到匹配的结束引用时结束.
这里CDATA表示有效属性在扩展实体后必须包含任意字符数据.
如果该属性已声明为NUMBER,则需要包含数字字符(或扩展为数字字符的实体).
在上面的示例中,CDATA属性的值为“& foo;”相当于“bar”,与NUMBER属性的值相同“0”相当于“0”(即使序列“0”包含除数字以外的字符).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。