曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
這個元素< B o o k >從我們在上面看到的第一個命名空間那里產生,而屬性I S B N從order 命名
空間產生。
7.3.3 范圍
命名空間聲明就像變量在程序語言里那樣有它的作用范圍。這非常重要,這是因為命名空
間并不是總是定義在X M L文檔開始,它們能夠被包含在文檔的較后部分。一個命名空間聲明因
此而應用于有聲明出現的元素,盡管與此同時子元素并沒有清清楚楚地描述出來。只要被用在
第7章命名空間和模式使用197 下載
圖7-1
保留關
鍵字
命名空間前綴
命名空間命名空間
文檔
命名空間聲明的范圍之內,就能夠訪問到命名空間。
但是我們也需要去混合命名空間,在那里元素另外地繼承命名空間的作用域,于是這里有
兩種可以聲明作用域的辦法:缺省和限定。
1. 缺省
如你想象的,在一個文檔里在每一個名稱前加一個前綴非常令人厭煩。實際上,通過在的
工具集里引入名稱作用域的概念,能夠分配很多前綴。如果定義了缺省的命名空間,在聲明作
用域里所有沒經驗證的名稱被假定屬于缺省的。于是如果你在根元素聲明了一個缺省的命名空
間,它將被看作整個文檔將缺省的命名空間,并只能在文檔里聲明過的更多的命名空間所覆蓋。
通常省略前綴可以將一個命名空間聲明為某范圍內缺省的。
這就是如何在X M L文檔里使用這些去內嵌入一些H T M L,這些文檔根據一種為書的內容所
設計的稱作B o o k C o n t e n t . d t d的D T D來標記:
程序清單7 - 4
< Ti t l e > , < A u t h o r > , < C o n t e n t >和< P a r a g r a p h >這些元素以及來自缺省命名空間的屬性n u m b e r在
< C h a p t e r >元素定義。但是在C h a p t e r元素里,你能看到t a b l e元素和它的子元素—t r和t d。這些
屬于用t a b l e元素聲明的HTML 命名空間。應注意到這個例子里當t a b l e元素關閉時,HTML 命名
空間聲明作用域隨之結束。下面P a r a g r a p h的出現并不是來自HTML 命名空間。
當一個前綴被定義并被一個名稱利用時,明確地聲明了命名空間。由于一個沒有限定而被
命名空間接受的名稱,一個缺省的命名空間必須被聲明為帶有一個作用域,這個作用域包括沒
限定的名稱(不包括前綴)。
2. 限定
如果你能夠清楚地區分命名空間當然非常好。但有些時候可能想要在一篇文檔里從外面的
命名空間來瀏覽名稱。你需要一個更精細的劃分尺度。除了在整個空間聲明命名空間,還可以
利用限定過的名稱。在文檔開頭聲明你將需要的命名空間,然后在使用地點限定它們。
198使用XML 高級編程
下載
程序清單7 - 5
在根元素M e a s u r e m e n t s,我們聲明了命名空間。缺省值涉及到了元素< O u t s i d e A i r > , < F u e l Ta n k >
和< Measurements>。但是我需要用測量單位驗證一部分我們曾用命名空間u n i t s和屬性u n i t s做過了
的內容。當這些屬性在文檔里突然出現時,能夠驗證那些名稱非常有用。最終,我需要區分一些
測量方法的類型,即p r o p : Vo l u m e和p r o p : Te m p e r a t u r e。盡管我已經在< F u e l Ta n k >元素里聲明這些
prop 命名空間,我還是可以依靠在開始聲明命名空間及使用限定名,自由地反復使用這個命名空
間(或許在一個更長的文檔里)
讓我們更仔細地看一下命名空間聲明并將它與在接下來的< C h a p t e r >元素里出現的命名空間
作一個對比。那個聲明被綁定在D T D上,這樣一來就可能使用與D T D沖突的名稱。在這個例子
里,我們有唯一的名稱,但沒有DTD URL。命名空間的存在主要是用來將名稱組織成特有的集
合以及回避名稱沖突。W3C 命名空間推薦標準沒有描述任何有關驗證的使用方法。確實, X M L
1 . 0 R e c o m m e n d a t i o n沒有說任何有關命名空間的東西。XML 模式的成就(后面我們將看到)做
得更多,但當前命名空間用于驗證的任何東西將要嚴格地保留一件人造物品—個人分析器工
具,直到XML 模式成為正式的W 3 C推薦標準。
7.4 在格式正規的書籍里使用命名空間實例
讓我們試著標記這本書的內容,并看一下是否能以一種有用的方式利用我們的工具命名空
間。假設像第3章那樣D T D內容已經建立。我們將要從現有的目錄D T D借用名稱,而不是再創建
存在于H T M L里的標記,同樣將借用命名空間。現在將把驗證問題放在一邊,并假設這個文檔只
需要被格式正規化。更多注意一下作用域問題,這里將要開始標記這本書,顯示這一章的開始
部分:
程序清單7 - 6
第7章命名空間和模式使用199 下載
我在根元素定義了兩個命名空間。內容命名空間是缺省值,因我需要嚴重依靠那個命名空
間并且想要限定盡可能少的名稱。我發現從目錄命名空間借用幾個名稱非常有用,于是用前綴
c a t聲明了那個命名空間。這允許我從目錄命名空間引進一些屬性,并在根元素包括它們,這些
屬性是從內容命名空間得到的。然后,我需要包含一個列表。這些在H T M L里已經建好,于是我
聲明了另一個命名空間:
<UL xmlns="http://www.w3.org/TR/REC/REC-html40">
我沒提供一個前綴,于是H T M L變成了缺省的命名空間,但這只是對于U L元素和它的子級,
列表項目( L I)。只要將那個區域合并,用與U L元素相近的標記,我們以缺省值回復內容命名空
間。
開始這個例子之前我要告訴你,這是一個格式正規的例子。的確,如果我在指向D T D的命
名空間聲明里提供了U R L并且要求你通過一個限定的解析器去運行它,你將會因為幾件事而震
驚。XML 1.0 推薦標準在每個文檔里并沒有提供一個以上的D T D。在這里,盡管D T D被用作唯
一的名稱,它們并沒有因驗證而讀出來,原始的D T D沒有來自HTML 命名空間名稱的概念。只
要你一試著引進外面的名稱,解析器將會指出錯誤,這是由于你引進的元素或屬性在第一個
中國航空網 m.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(72)