我正在创建一个使用xml和xsl的左导航系统。在我尝试在xml文档中使用特殊字符之前,一切都很顺利。我正在使用»
,我得到了错误。
原因:引用未定义的实体'raquo'。
错误代码:-1072898046
我如何使这项工作?
答案 0 :(得分:21)
您正在尝试在非HTML或非XHTML文档中使用HTML entity。这些实体在文档Document Type Definition (DTD)中声明。
您应该使用entity reference的数字Unicode版本。例如,对于»
,您应该使用»
或者,你可以define them in your XML document's DTD:
<!ENTITY entity-name "entity-value">
<!ENTITY raquo "»">
否则,如果您的文档是UTF-8,我相信您可以直接在XML文档中使用实际字符。
»
答案 1 :(得分:6)
您是否为文件指定了文档类型?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
如果您忘记指定它,我认为您可能会遇到此类错误。
如果您按照数字而不是名称指定实体,有时实体也会起作用。
» « instead of » and «
答案 2 :(得分:3)
您无需在DTD中声明实体,甚至使用 DTD。您可能不需要使用该字符的Unicode表示。您当然不需要使用CDATA部分。
您需要做的是使用DOM来构建XML,而不是尝试使用字符串操作来构建它。 DOM将为您解决此问题。
在C#中,此代码:
XmlDocument d = new XmlDocument();
d.LoadXml("<foo/>");
char c = (char)187;
d.DocumentElement.InnerText = "Here's that character: " + c;
Debug.WriteLine(d.OuterXml);
d.DocumentElement.InnerText = "Here it is as an HTML entity: »";
Debug.WriteLine(d.OuterXml);
生成此输出:
<foo>Here's that character: »</foo>
<foo>Here it is as an HTML entity: &raquo;</foo>
从第一个示例中可以看出,»字符在XML文本中是完全合法的。但我认为你并不想代表这个角色。
我认为您正在尝试根据您报告的错误消息执行第二个示例中的操作。您正试图表示字符串»
。在XML文本中表示该字符串的正确方法是转义&符号;因此:&raquo;
。
因此,如果您必须使用字符串操作来构建XML,请确保您转义源数据中的任何&符号。不要强调这一点,但如果您使用的是DOM,那么这将自动为您完成。
另一件事。很可能在您的原始问题中,现在显示“我正在使用”,您实际上键入的是“我正在使用&amp; raquo;”。但实际的帖子看起来并不像那样。如果您需要在markdown中逐字表示文本,请将其括在反引号中;否则,HTML实体将在呈现帖子时转换为其角色表示。
答案 3 :(得分:1)
这是一个问题,因为并非所有HTML实体都是XML实体。您可以像Pat建议的那样将HTML的DTD导入到文档中,或者执行以下操作之一:
用数字实体代码替换所有特殊字符的出现:
» becomes »
将所有特殊字符包含在CDATA标记
中<![CDATA[»]]>
在文档顶部定义实体
<!DOCTYPE ROOT_XML_ELEMENT [ <!ENTITY raquo "»"> ]>
答案 4 :(得分:0)
您是直接使用»符号还是将其定义为&amp; raquo; ?如果您使用的是转义符号,您是否忘记了分号?
答案 5 :(得分:0)
乔
当我使用unicode版本显示正方形时。
将实体decalration放入xml doc会产生“不能在DTD之外进行DTD声明”。错误。我想这是预期的。
当我使用''在外部包含dtd时,它似乎没有任何效果。
我想知道这可能是服务器问题。我正在本地开发这个并使用Baby Web Server。
答案 6 :(得分:0)
只需将您的HTML实体»
替换为任何XML和HTML中的数字参考»
。
答案 7 :(得分:0)
我发现自己谷歌搜索了很多这样的信息,所以决定在我自己的网站上发布一个矩阵,其目的很简单,就是可以快速查找:
http://martinkool.com/characters
使用&amp;#...;形式确实。
答案 8 :(得分:0)
如果希望输出文档包含命名的HTML实体»
而不是数字引用,请将以下元素添加到样式表中(仅限XSLT2.0 ):
<xsl:output use-character-maps="raquo.ent"/>
<xsl:character-map name="raquo.ent">
<xsl:output-character character="»" string="&raquo;"/>
</xsl:character-map>