12

我正在使用 xml 和 xsl 创建一个左侧导航系统。一切都很顺利,直到我尝试在我的 xml 文档中使用一个特殊字符。我正在使用»,我得到了错误。

原因:对未定义实体“raquo”的引用。
错误代码:-1072898046

我该如何进行这项工作?

4

9 回答 9

22

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 "&#187;">

Otherwise, if your document is UTF-8, I believe you can just use the actual character directly in your XML document.

»
于 2008-10-16T16:19:54.697 回答
6

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.

&#187; &#171; instead of &raquo; and &laquo;
于 2008-10-16T16:14:49.823 回答
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: &raquo;";
 Debug.WriteLine(d.OuterXml);

产生这个输出:

<foo>Here's that character: »</foo>
<foo>Here it is as an HTML entity: &amp;raquo;</foo>

从第一个示例中可以看出,» 字符在 XML 文本中是完全合法的。但我不认为你试图代表那个角色。

我认为您正在尝试根据您报告的错误消息执行第二个示例中的内容。您正在尝试表示字符串&raquo;。在 XML 文本中表示该字符串的正确方法是转义 & 符号;因此: &amp;raquo;

因此,如果您必须使用字符串操作来构建 XML,只需确保您对源数据中的任何 & 符号进行转义即可。不赘述这一点,但如果您使用的是 DOM,这将自动为您完成。

另一件事。很有可能在您的原始问题中,现在显示为“我正在使用 »”,您实际输入的是“我正在使用 »”。不过,实际的帖子看起来不是那样的。如果您需要在 Markdown 中逐字表示文本,请将其括在反引号中;否则,HTML 实体将在呈现帖子时转换为它们的字符表示。

于 2008-10-16T19:56:17.007 回答
1

这是一个问题,因为并非所有 HTML 实体都是 XML 实体。您可以按照 Pat 的建议将 HTML 的 DTD 导入文档,或执行以下操作之一:

用数字实体代码替换所有出现的特殊字符:

&raquo; becomes &#187;

将所有出现的特殊字符包装在 CDATA 标记中

<![CDATA[&raquo;]]>

在文档顶部定义实体

<!DOCTYPE ROOT_XML_ELEMENT [ <!ENTITY raquo "&#187;"> ]>
于 2008-10-16T16:21:34.350 回答
0

我发现自己经常在谷歌上搜索此类信息,因此决定在我自己的网站上发布一个矩阵,以便快速进行查找:

http://martinkool.com/characters

使用 &#...; 确实是形式。

于 2008-10-27T21:37:50.143 回答
0

您是直接使用 » 符号还是将其定义为 » ? 如果您使用转义符号,您是否忘记了分号?

于 2008-10-16T16:02:49.113 回答
0

当我使用 unicode 版本时显示一个正方形。

将实体声明放入 xml 文档会产生“不能在 DTD 之外有 DTD 声明”。错误。我想这是意料之中的。

当我使用 '' 在外部包含 dtd 时,它似乎没有任何效果。

我想知道这是否可能是服务器问题。我正在本地开发它并使用 Baby Web Server。

于 2008-10-16T17:35:02.453 回答
0

只需将您的 HTML 实体替换为适用于任何 XML 和 HTML&raquo;的数字引用。&#187;

于 2008-10-17T14:56:09.403 回答
0

如果您希望输出文档包含命名的 HTML 实体&raquo;而不是数字引用,请将以下元素添加到您的样式表(仅限 XSLT2.0):

<xsl:output use-character-maps="raquo.ent"/>
<xsl:character-map name="raquo.ent">
    <xsl:output-character character="&#187;" string="&amp;raquo;"/>
</xsl:character-map>
于 2010-10-05T13:17:44.947 回答