我正在使用 xml 和 xsl 创建一个左侧导航系统。一切都很顺利,直到我尝试在我的 xml 文档中使用一个特殊字符。我正在使用»
,我得到了错误。
原因:对未定义实体“raquo”的引用。
错误代码:-1072898046
我该如何进行这项工作?
我正在使用 xml 和 xsl 创建一个左侧导航系统。一切都很顺利,直到我尝试在我的 xml 文档中使用一个特殊字符。我正在使用»
,我得到了错误。
原因:对未定义实体“raquo”的引用。
错误代码:-1072898046
我该如何进行这项工作?
You are trying to use an HTML entity in a non-HTML or non-XHTML document. These entities are declared in the document's Document Type Definition (DTD).
You should use the numerical Unicode version of the entity reference. For example, in the case of »
you should use »
Alternatively, you can define them in your XML document's DTD:
<!ENTITY entity-name "entity-value">
<!ENTITY raquo "»">
Otherwise, if your document is UTF-8, I believe you can just use the actual character directly in your XML document.
»
did you specify a doc type for your file ?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
I think you might get such errors if you forget to specify it.
Also sometimes the entities work if you specify them by number instead of name.
» « instead of » and «
您不需要在 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,这将自动为您完成。
另一件事。很有可能在您的原始问题中,现在显示为“我正在使用 »”,您实际输入的是“我正在使用 »”。不过,实际的帖子看起来不是那样的。如果您需要在 Markdown 中逐字表示文本,请将其括在反引号中;否则,HTML 实体将在呈现帖子时转换为它们的字符表示。
这是一个问题,因为并非所有 HTML 实体都是 XML 实体。您可以按照 Pat 的建议将 HTML 的 DTD 导入文档,或执行以下操作之一:
用数字实体代码替换所有出现的特殊字符:
» becomes »
将所有出现的特殊字符包装在 CDATA 标记中
<![CDATA[»]]>
在文档顶部定义实体
<!DOCTYPE ROOT_XML_ELEMENT [ <!ENTITY raquo "»"> ]>
您是直接使用 » 符号还是将其定义为 » ? 如果您使用转义符号,您是否忘记了分号?
乔
当我使用 unicode 版本时显示一个正方形。
将实体声明放入 xml 文档会产生“不能在 DTD 之外有 DTD 声明”。错误。我想这是意料之中的。
当我使用 '' 在外部包含 dtd 时,它似乎没有任何效果。
我想知道这是否可能是服务器问题。我正在本地开发它并使用 Baby Web Server。
只需将您的 HTML 实体替换为适用于任何 XML 和 HTML»
的数字引用。»
如果您希望输出文档包含命名的 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>