2012-12-04 21 views
2

在Firefox:如何包含HTML實體到XML文件

<?xml version="1.0" encoding="utf-8"?> 
<math display="block" xmlns="http://www.w3.org/1998/Math/MathML"> 
    <mi>&rho;</mi> 
</math> 

導致 「未定義實體」 的錯誤。

我知道那裏缺少一些東西。我只是不知道該怎麼寫才能糾正這個問題。我想避免在文檔中重寫每一個unicode字符。

編輯我嘗試以下,仍然沒有工作,同樣的錯誤:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE math [ 
    <!ENTITY % HTMLlat1 PUBLIC 
    "-//W3C//ENTITIES Latin 1 for XHTML//EN" 
    "xhtml-lat1.ent"> 
    %HTMLlat1; 
    <!ENTITY % HTMLsymbol PUBLIC 
    "-//W3C//ENTITIES Symbols for XHTML//EN" 
    "xhtml-symbol.ent"> 
    %HTMLsymbol; 
    <!ENTITY % HTMLspecial PUBLIC 
    "-//W3C//ENTITIES Special for XHTML//EN" 
    "xhtml-special.ent"> 
    %HTMLspecial; 
]> 
<math display="block" xmlns="http://www.w3.org/1998/Math/MathML"> 
    <mi>&rho;</mi> 
</math> 

編輯在Chrome中,這將導致以下消息:

error on line 6 at column 13: PEReference: %HTMLlat1; not found 
warning on line 10 at column 15: PEReference: %HTMLsymbol; not found 
warning on line 14 at column 16: PEReference: %HTMLspecial; not found 

編輯嘗試下載.ent文件並將引用更改爲本地http://路徑或file:///路徑,但沒有成功。 類似的職位有關的主題:XML catalog in PHP

編輯的瀏覽器快速的解決方法:

<!DOCTYPE html> 
<math display="block" xmlns="http://www.w3.org/1998/Math/MathML"> 
    <mi>&rho;</mi> 
</math> 

您需要抑制XML頭,因此它被理解爲HTML。

不過,這並沒有回答問題,因爲問題是導入實體,而文檔被聲明爲XML。

ANSWER

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE math PUBLIC "-//W3C//DTD MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/mathml2.dtd"> 
<math display="block" xmlns="http://www.w3.org/1998/Math/MathML"> 
    <mi>&rho;</mi> 
</math> 
+2

我認爲(想!)命名實體僅在HTML定義。您可能需要數字或六進制等效 –

回答

1

添加MATHML 2.0文檔類型,XML聲明後:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE math 
    PUBLIC "-//W3C//DTD MathML 2.0//EN" 
      "http://www.w3.org/Math/DTD/mathml2/mathml2.dtd" 
> 

原因是手柄實體引用在Web瀏覽器中非常笨拙。他們實際上並不閱讀DTD。相反,它們具有預定義實體的內置表,可以使用特定的doctype字符串打開它們。這是字符串魔法,例如使用MathML 3.0 doctype將不起作用。參看到XML to XHTML using XSLT: using entities such as &Sum; (which is a MATHML entity)(特別是Martin Honnen對答案的評論)。

或者,也可以使用字符,或者如果您的創作系統無法方便地創建它們,則可以使用字符引用,如&#x3c1;

1

如果你可以修改XML以有內部DTD可以定義實體有:

> <!DOCTYPE yourRootElement [ 
>  <!ENTITY bull "&#8226;"> 
>  .... ]> 
+0

這些符號是在某處定義的,我想使用對官方外部源的引用,例如。 http://www.w3.org/TR/xml-entity-names/ –

+0

@FabienPolley是mathml,html和xhtml定義的官方來源(請參閱我的回答) –

+0

但是,您應該使用@ Jukka's回答爲(在瀏覽器中),將使用從更新來源定義的實體,而不是MathML2規範中似乎引用的實體。 –

1

請注意,XHTML1和MathML2中的定義現在已經過時,並且與當前瀏覽器中內置HTML解析器的定義不一致。在MathML3和HTML5當前使用的定義在這裏被定義

http://www.w3.org/2003/entities/2007doc/Overview.html

這是編輯(我:-)草案,在頂部的REC版本的鏈接。

爲實體的單個文件集DTD聲明的是

http://www.w3.org/2003/entities/2007/htmlmathml-f.ent

一般來說,最好是使用數字的引用而不是命名實體的XML上下文瀏覽器不會獲取外部引用DTD。

如果您通過公共標識符引用xhtml或mathml2 dtd,則遵循HTML(5)規範的瀏覽器將使用從上述規範派生的一組內置定義(即,它們不使用您指定的實體定義)。

看到相關的bug對HTML規範

https://www.w3.org/Bugs/Public/show_bug.cgi?id=13409