XHTML簡介
XHTML文檔框架
為了讓初學者一上來就能對XHTML有一個感性認識,先在這里將XHTML文檔的框架結構做一個簡單展示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
???<head>
??????<title>文檔標題</title>
???</head>
???<body>
??????<h1>文檔正文內容</h1>
???</body>
</html>
“麻雀雖小,五臟俱全”,這個文檔完整的演示了一個標準的XHTML頁面。你可以在你的機器上新建一個文本文檔(記事本),將其后綴名改為.html,然后雙擊用瀏覽器打開,這樣你就能夠看到一個頁面。當然,也有可能你看到的是亂碼,這個問題稍后再作詳細解釋,先來大致了解一下XHTML。要不然,你說你在寫XHTML,別人問你“什么是XHTML啊?”,你卻答不出,那豈不糗大了!
什么是XHTML
XHTML的全名是eXtensible HyperText Markup Language(可擴展的超文本標記語言)。根據W3C的官方解釋,“XHTML(http://www.w3.org/TR/xhtml1)是一個用XML語法對HTML重新闡述的語言”。如果用稍微準確一點的語言來說,XHTML是一個基于XML的置標語言,并且看起來和HTML有些相像,只有一些小的但卻重要的區別。
為什么要用XML重新闡述HTML呢?XML是一致的,而HTML則不具備這個特征。基于XML的語言和工具是目前Web表現的“金幣”和通向未來的鑰匙。如果你用基于XML的語言開發頁面,你的站點就會很好地和其他基于XML的語言、應用程序和協議進行交互。但是,原始的XML數據還不能服務大多數Web瀏覽器,還不能期待它們更智能地做一些事情,比如顯示一個精細格式化的網頁。XHTML是一個過度技術,結合了XML的強大功能及HTML的簡單特性。而且,以后由XHTML轉換到XML是很簡單的,甚至根本不用轉換,因為XHTML本身就是基于XML的。
大體上可以這樣理解,XHTML就是一個扮演著類似HTML的角色的XML,它可以顯示在舊的和新的Web瀏覽器中,同樣可以工作在大多數的Internet設備中,比如從Palm的pilots到Web電話,到屏幕閱讀器。XHTML是當前置標語言的標準(用來替代HTML 4),用來為Web內容設計嚴格的、合理的文檔結構,并能和其他類似CSS和DOM的Web標準進行協作,還能很好地和其他現有的和未來的基于XML的語言、應用程序和協議進行交互。XHTML包含格式化的文本數據,它的結構包括:標題、副標題、段落、數字列表、定義列表等等,就像HTML一樣容易學習和使用。
剖析框架
我們已經看到了XHTML頁面的基本框架結構,知道了什么是XHTML,并且很可能迫不及待的已經親自動手創建了一個頁面。千萬別小看這些工作,慢慢你會發現這個基本框架其實就是一個標準框架,我們在Internet上看到的所有色彩斑斕的網頁,都是在此基礎上擴展而來的。當然,也有不少不符合這個框架的,那是因為它們不符合Web標準。關于Web標準的問題,前面已經談到,在此不再廢話,接下來我們一起剖析一下這個“簡單”的基本框架,你會發現暗藏許多道道!……
XML文檔說明
<?xml version="1.0" encoding="UTF-8"?>
位于所有XML文檔的頂部,叫做“XML文檔說明”。 XHTML是一個基于XML的置標語言,當然也少不了這個說明。這個“位于頂部”是有說道的,必須是位于文檔的第一行第一列,也就是說文檔必須開篇便是這個“說明”,前面不能有任何東東,包括空格和注釋,夠絕的吧,絕絕對對的頂部。說明包含兩個內容:
- version="1.0":文檔采用的XML語言的版本。這一項是必須的!
- encoding="UTF-8":文檔采用的編碼格式。這一項是可選的,若沒有,則采用缺省編碼格式!編碼格式是一個很復雜的東東,我搜集了一些材料,正在潛心研究,以期終極解決,等有了成果,有了時間,我會整理出來,大家一塊參考。大家多數用的是Windows,系統默認的編碼格式是GBK,所以我在上面說你很可能看到的是亂碼,把"UTF-8"改為”GBK”就OK了,試試看!
你知道嗎?
當前流行的瀏覽器對于標準的支持并不是那么完美,所以有時候對于這個“XML文檔說明”的解析會發生錯誤:
-
MSIE6或MSIE7會完全忽略這個說明。也就是說,不管你在說明中指定文檔采用何種編碼,它都不予理睬。那么MSIE6或MSIE7是如何識別文檔的編碼的呢?它會自動分析你的文檔的實際存儲編碼,并將按此編碼顯示。這句話聽著很拗口,舉個例子說明一下。假設你使用的是Windows操作系統,你用記事本新建了一個.txt文件,然后將上面的基本框架結構代碼敲進去,當然我猜你會拷貝,這個也沒關系,一樣的,將其重命名為framework.html,這時你應該看到圖標變為一個網頁的圖標,說明你已經成功創建了一個頁面。如果你重命名后,圖標沒有變化,則很可能是因為系統隱藏了擴展名,系統默認是隱藏已知文件類型的擴展名的,你需要將系統設置為顯示擴展名,具體設置方法是:打開“我的電腦”——>工具——>文件夾選項——>查看,在高級設置中下拉,找到“隱藏已知文件類型的擴展名”,選中它,即可!若再不行,我也沒轍了,附近找個高手請教一下吧!
元歸正傳,此時你創建的文檔的實際存儲編碼是GBK,而你指定的編碼為UTF-8。很明顯,你的文檔和指定的編碼是不符的,這是有問題的。但是,雙擊一下,用IE打開看看,正確顯示了,沒有亂碼,神奇吧!從某種角度上來說,IE的這種做法是很“智能”的,我們不用去考慮編碼問題,它會自動識別,總是以正確的形式顯示。但是,這種“智能”往往會在不經意間給我們帶來大的麻煩。它“智能”地屏蔽了我們對于編碼這一本質的理解,讓我們誤以為“編碼是無關緊要的”。更要命的是,當我們指定了錯誤的編碼時,它也能夠正確的顯示,我們還沾沾自喜于自己的錯誤而不知,實際上已經種下了隱患。智能化、傻瓜化是微軟產品的一大特點,這是它的優點,也是他的缺點,好美的辯證法——這句純屬個人感慨,廢話!
-
IE“智能”得有些不專業,那我們看看最近很火的Firefox表現如何?我用的是Firefox/2.0.0.9,應該是最新版本。把上面的網頁用Firefox打開一看,果然不負眾望,是亂碼!!現在,我們稍作修改,把“XML文檔說明”中的UTF-8改為GBK,再用Firefox看一下(刷新一下就行)。嗯,這次真的不負眾望,正確顯示了!Firefox真的不負眾望嗎?再試它一試!用UltraEdit-32新建一個文檔,將剛才做好的頁面代碼拷貝進去,讓“XML文檔說明”中的編碼為UTF-8,保存文檔為UTF-8格式,用我們可愛的Firefox看一眼。不錯,出現了可愛的正確顯示,沒有亂碼。你是不是快要愛上Firefox了,接下來可要看清楚嘍,再漂亮的人也有缺點!把“XML文檔說明”中的UTF-8改為GBK,保存一下,再用Firefox看看。如何?正確顯示,沒有亂碼,但是這次并不可愛!估計你和我一樣,想看到的是亂碼才對。嗯,你和我都沒有錯,錯的是Firefox。Firefox也會自動識別文檔的實際存儲編碼,若文檔的實際存儲編碼為UTF-8,他就會忽略用戶的編碼指定,“不顧一切”的使用UTF-8顯示。看來,軟件還是軟件,怎么都不及人聰明!但是軟件還不是人寫的,怎么就不能嚴格按照標準來?
說明:這里提到了UltraEdit-32編輯器,用它把一個文檔存儲為指定的編碼格式,例如UTF-8,可能有些同胞對此不太熟悉,有些迷茫。沒關系,UltraEdit-32是一個很好用的文本編輯器,網上很容易下到,如果想要,留下你的Email,我會發給你,我的版本是UltraEdit-32 13.10a+1,中文版、英文版都有,還有一個注冊碼生成器。關于UltraEdit-32的使用,我下一節將會簡單講解,UltraEdit-32功能很豐富、很強大,我也只是蜻蜓點水的用,想深入探究的可以看它的幫助文檔,安裝完成后自帶的有。最后順帶說一下,要想把一個文檔存儲為UTF-8的格式,其實記事本也可以輕松做到,當你保存一個尚未取名的文檔,或者是“另存為”一個文檔時,都會跳出一個對話框,要求你輸入保存的名稱,你有沒有看到最下方的“編碼”下拉框,看看里面都有什么,明白了吧?相信你一定已經明白了,俺就不廢話了!
- 再來說一款比較流行的,很優秀的瀏覽器Opera的表現。我用的是Opera/9.50 beta,,也應該是最新版本。它的表現和Firefox雷同,不再贅述,有興趣的可以自己測試一下。Opera和Firefox一樣是開源的,很容易下載到,不過我用的Opera/9.50 beta是英文版,好像還沒有中文版,將就一下吧!
說完了瀏覽器對于編碼方式解析的bug,再說說它們對于缺省編碼的解析情況。前面說過,“XML文檔說明”中的encoding="UTF-8"是可省的,若省略則使用默認的缺省編碼解析。上述三個主流瀏覽器對于缺省編碼的解析卻有著驚人的一致——自動分析文檔的實際存儲編碼,并將按此編碼顯示。我也覺得這樣是最合理的!所以,當我們不指定“XML文檔說明”中的編碼時,瀏覽器會自動識別編碼,并總是正確地顯示。你是不是覺得很好,很方便?不錯,是很方便,但卻不好!我不贊同這么做,推薦使用完整的“XML文檔說明”,在說明中將編碼格式明確地指定,當然更要正確地指定!
推薦原因:
- 方便自己或別人在看文檔時了解文檔采用的編碼格式。不然,可能猜上半天,最后還搞錯了。
- 方便使用程序對文檔進行自動化處理和轉換。比如,對于文檔編碼格式的檢查校驗,或者利用XML轉換工具將文檔信息轉換為別的形式,和其他應用程序通信。
- 3. 符合Web標準,能夠在將來的瀏覽器中不做任何修改的繼續正確運行。
你可能要發牢騷了,我指定了編碼格式,瀏覽器又不會完全按照我指定的編碼去解析,有意義嗎?就算指定錯了,它可能仍傻傻的正確顯示,我也不知道指定的編碼有誤啊,反而畫蛇添足?怎么能讓瀏覽器一定按照我指定的編碼去顯示呢?
這個當然也是有辦法解決的,如果你運氣不好,遇到了這種問題,也不用太著急,咱“兵來將擋,水來土掩”,接著往下看……
三種DTD
所謂DTD就是Document Type Definition的縮寫,直譯過來就是文檔類型定義。這個直譯的效果還不錯,以后就叫做“文檔類型定義”吧。大家顧名思義一下,“文檔類型定義”就是對于文檔類型的定義,作用就是定義文檔類型的。轉來轉去,我也暈了,大家先有個感性認識,一塊兒仔細看看。
XHTML 1提供了三種DTD:過渡的(Transitional)、嚴格的(Strict)、框架的(Frameset)。
過渡的—<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1- Transitional.dtd">,最寬松的DTD,他宣稱的目標是“自己活,也讓別人活”;
嚴格的—<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">,揮著鞭子的冷酷的DTD,逼著你不能使用表現層的標記和屬性。
框架的—<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1- Frameset.dtd">,20世紀90年代最流行的布局方式,同樣地,也可以在你的設計中使用。
個人覺得,這里沒有什么好說的。過渡型的要求很寬松,是為了推動XHTML取代HTML的進程,專門為那些已經習慣與使用老式的、非標準的HTML的人準備的,方便它們向嚴格的XHTML過渡;而框架的更是很少人用,可以略過;將來的方向是嚴格的(Strict),因為只有它才完全符合將標記和表現層分離的設計宗旨。大家還是奔著“方向”跑吧!
<html>和命名空間
html標簽(也稱作標記)是XHTML頁面的主體部分,除了文檔說明和DTD聲明外,整個頁面的所有內容都包含在該標簽中。html標簽由<html>和</html>兩部分構成,我們不妨稱之為開標簽和閉標簽。它們分別標識著html的開始和結束。html標簽內包含head和body兩個標簽,分別標識頁面頭和頁面體。
細心的你一定發現了,html的開標簽中還包含了xmlns="http://www.w3.org/1999/xhtml"這么個東東。這個叫做標簽的屬性,所有的屬性都是放在開標簽中的。xmlns是xml和namespace的縮寫,就是“xml的命名空間”的意思。那么什么是命名空間呢?這個嘛,這個嘛……這個我也只是大概的知道有那么回事,還不能徹底說清楚里面的道道。好像是命名空間定義了可以使用的標簽以及使用規則,使用不同的命名空間,可以使用不同的標記集合,如果你想使用特定的標記,就得聲明它對應的命名空間。注意噢,我這里說的是“好像是”哦,暫不對此說法付“法律”責任。關于這個,我下去會抽空好好研究,然后再和大家分享探討,敬請隨時關注。也歡迎路過的高手給予指點,免去我的摸黑的痛苦!嘿嘿……
如果你暫時不想深入研究,那就先不要管它,知道有這么回事就行,日后有緣再殺個“回馬槍”,將它徹底解決。到時如果我還沒搞清楚,別忘告訴我一聲噢。這里先就這么用,甭管它。
<head>
你已經知道,head標記包含于html。那么它是干什么的呢?
head標記也同樣由<head></head>兩部分構成。<head>一般沒有屬性,有兩個基本用途:
- 1. 定義文檔聲明
- 包括標題的定義、關鍵字的定義,還有文檔編碼的定義等等。標題的定義,大家已經見過了,“<title>文檔標題</title>”就是,用瀏覽器打開你剛才做的網頁看看,看到它在哪里了嗎?沒看見的請仔細掃描一下左上角。
- 2. 定義文檔引用
- 包括css的引用,script的引用等。這個又分為外部引用和內部引用。涉及內容很多,以后再慢慢詳細介紹。
你是不是要問我head里怎么也有一個“文檔編碼的定義”?再想想我們在前面設的懸念——如何讓瀏覽器一定按照我指定的編碼去顯示呢?噢,噢噢噢噢噢噢……相信你想到了!對,就是在這里再指定一下文檔的編碼。格式如下:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
別處不用動,只需將charset=UTF-8中的“UTF-8”改為你想要設定的編碼即可。你可以自己按照上面用過的方法測試一下,看看瀏覽器是不是聽你的話。反正上面的三個瀏覽器都很聽我的話,如果你的不聽話,就是你的人品問題了,呵呵!只要在文檔的head中加入了這句編碼聲明,瀏覽器會嚴格的執行編碼檢查。此時,XML文檔說明中的編碼指定將會被忽略,也就是說如果XML文檔說明中的編碼指定和head中的相悖,瀏覽器會毫不猶豫的按照head中的執行,上面三個瀏覽器均如此。也就因此,有些人建議把XML文檔說明去掉,我還是推薦兩個都留著,并且保持一致。推薦原因還是上面那三條。
注意:所有的head標記里的內容都不顯示在頁面的正文中。或者說,除了title標記的內容顯示在瀏覽器的標題欄外,其余的內容都根本不顯示。(其實,還有一個也是顯示的,那就是網站的圖標。或許你已經發現,瀏覽好多的網站頁面時,在瀏覽器地址欄的開頭都會顯示一個別致的圖標,那是怎么弄上去的呢?待日后專門講解head標記時再詳細解答,到時你會發現head原來還有那么多奇妙的用途!)
<body>
現在就剩下body了!顧名思義,在<body></body>之間的就是正兒八經的頁面主體內容了。把你想寫的,想在頁面中展示的內容,無論文章,還是圖片,都盡情的寫進body吧,它會將它們完美展示!前提是——你得寫的正確!
如何才能寫得正確,做出一個靚麗的、符合標準的、專業的頁面呢?這次可不是“且聽下回分解”了,而是得慢慢的認真專研!當然,我也會在下好多回分解。基本上,以后的所有回,都是為了這個目標而努力。
補充
補充三點:
- 注釋。
和別的程序設計語言一樣,XHTML也有自己的注釋(HTML就有)。注釋格式很簡單,以<!--開始,以-->結尾,即<!--注釋-->。注釋基本上可以出現在頁面文檔的任何位置,除了一個標記的內部,如<head <!--文檔頭-->>,因為這會造成解析的歧義,引起錯誤和混亂。
- 排版和縮進。
這個是編程風格的問題。一個好的程序員,包括頁面編程,應該具備良好的編程風格,使編程的代碼清晰易讀。有兩個需注意的基本點:
- 根據層次縮進。我喜歡3空格縮進,沒太多科學的理由,只是覺得2空格太近,4空格太遠。
- 不同功能的代碼塊間應空行。
- XHTML書寫規范。
- 所有標簽都有開必有合。開標簽和閉標簽多成對出現,也有少數例外,比如換行標記
,它是開合標簽在一起,后面的“空格+/”表示標記結束。注意:,此處空格不可少!
- 標簽嵌套不可混亂。正確:<p><strong>Hello</strong></p>;錯誤<p><strong>Hello</p></strong>。
- 所有標記和屬性一律小寫。
- 屬性值必須用””引起來。
推薦
為了引起大家對于規范的重視,推進代碼的標準化和文檔化,推薦采用以下模板。當然,這只是一家之拙見,并不能適合于任何場合,供參考,希望大家多做交流,以期拋磚引玉。
<?xml version="1.0" encoding="UTF-8"?>
<!--*******************************
* 項目說明:Web標準學習整理
* 文件說明:本頁面是一個XHTML 1.0框架
* 開發團隊:IT學社
* 編寫者 :陳貴波 (ChenGB)
* 創建日期:2008-01-20 —2008-01-21
* 版權聲明:免費供大家交流學習,禁止商業使用,IT學社保留一切版權。
********************************-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
???<head>
??????<title>文檔標題</title>
??????<meta http-equiv="Content-Type" content="text/html; charset= UTF-8" />
???</head>
???<body>
??????<h1>文檔正文內容</h1>
???</body>
</html>
寫在最后的話
整理上面這些文字,全是因為兩個理念:標準化和開源共享。自從第一天接觸她們,便深深為之吸引。標準、開放、共享,用大家的智慧為大家服務,一個偉大而又有前途的想法。本人水平有限,但仍會堅持分享、交流我所知道的,希望能對大家有所幫助,更希望能拋磚引玉,從大家那里學到更多的東東,希望大家能多多支持……