Prefijo?(Sr.,?Sra.,?Srta.)?
?
Sufijo?o?título?
?Línea?1?de?dirección?
??
??
?
Ciudad?
?
Región,?estado?o?provincia?
?
Código?postal?
?Código?de?área?
?
Número?de?teléfono??
?
OK?
?
sp?
?
iso-8859-1?
?
Spanish?
??
?
xmltrans.xml文件的第一行是XML聲明。其中的version屬性告訴讀者文檔符合XML?1.0的標準,encoding屬性指示解析
器使用壓縮版本的Unicode:?
?
一個XML文檔需要一個包含其他元素的根元素。因為這里的例程是包含一些語言,所以就命名根元素為languages:?
?
作為集合類型,languages元素包含了一個或多個language元素:?
?
以上language標記包含4個屬性。xml:lang屬性是其中最重要的,在ASP程序中將通過這個屬性值的2字母語言代碼搜索
字符串組。其他的屬性,比如charset,可以為將來的功能擴充而用。?
每種語言節點中,我都添加了一個元素作為變量,其中含有顯示在HTML頁面上的文字。XML允許使用有含義的名字作為
自定義標記,比如,我使用元素包含HTML頁面的標題。同樣,元素包含字符串"First?name"。?
Localize?ASP?with?XML?
First?name?
最后,良好格式的XML文檔包含了一整套對應于HTML頁面的字符串。下圖顯示了XML文件中的標記和English語言字符
串。注意,現在這里只討論English版本,以后可以添加更多種語言。?
ASP文件代碼分析?
現在回來看看ASP文件xmltrans.asp。在其中我們使用XML路徑語言(XPath),它可以在微軟的XML解析器(MSXML)中
執行。你可以認為XPath是抵達XML文檔一部分內容預定位置的工具,這有些類似于在命令行中輸入一個路徑以執行文件,
比如c:/winnt/notepad.exe,或者在瀏覽器中敲入了一個URL訪問頁面。下面研究這個ASP文件看看如何取回English語言字
符串。首先,我們實例化一個叫做MSXML2.DOMDocument的XML解析器工作對象:?
set?doc=server._?
CreateObject?_?
("MSXML2.DOMDocument")?
由于ASP程序不能象Win32程序一樣處理事件,所以在這里我們關閉了異步操作選項。這樣就確保了在轉向其他任務
前,腳本程序會一直等待當前事件的完成:?
doc.async?=?False?
接著使用DOMDocument對象的Load方法裝載包含字符串的XML文檔。如果轉載過程中發生了錯誤,就發出警告信息并停
止運行:?
if?not?doc.Load(server._?
mappath("xmltrans.xml"))?then?
?msg="Failed?to?load?"?
?msg=msg?&?"the?XML?file"?
?Response.Write?msg?
?Response.End?
end?if?
我們可以使用兩種方法查詢XML文檔:XSL和XPath。在這里讓解析器使用后者,傳遞屬性名字和正確數值給
setProperty方法:?
doc.setProperty?_?
?"SelectionLanguage",?"XPath"?
然后,創建選擇XML文檔部分內容的路徑。很明顯,相關字符串位于languages元素的某個位置內,因此languages成為
路徑的最開始部分。同時我們知道字符串是被包含在一個language元素內的,但是是哪一個呢?請別忘記在前面的XML文檔
中,我們嵌入了一個叫做xml:lang的屬性,并給出了一個唯一數值“en”。這就是我們要選擇的,下面是操作它的語法:?
sel="/languages/language"?
sel=sel?&?"[@xml:lang='en']"?
這有些不好理解,但你可以將這段XPath代碼想像為一個SQL語句,類似于取回一個記錄集的命令:?
SELECT?*?FROM?languages.language?WHERE?xml:lang='en'?
回到現實的XPath查詢,要使用下面的代碼返回包含第一個匹配節點的節點對象:?
set?selectednode?=?_?
?doc.selectSingleNode(sel)?
最后一步是傳遞元素名字("title")給selectSingleNode方法,并要求它取回"title"節點的text屬性值。就是說,取
得包含在和的文字。在這里,取回的文字是"Localize?ASP?with?XML":?
txt=selectednode._?
selectSingleNode("title").text?
與SQL命令對照,就象從ADO記錄集內部取回一個字段值,語句是:?
txt=rs("title")?
在ASP頁面中插入語言字符串?
知道了如何從XML元素中選取文字并賦值給變量,就可以將變量值插入到HTML流中了。為了使代碼簡潔,創建一個叫做
getstring()的函數,如下:?
function?getstring(instring)?
temp=selectednode._?
selectSingleNode?_?
(instring).text?
getstring=?_?
server.htmlencode(temp)?
end?function?
getstring()函數的輸入值是元素名,元素值要從XML文檔中取回。比如,將"firstname"傳遞給getstring(),
getstring函數就選擇firstname元素并返回它的文本數值。為保險起見,在返回給調用者前,我們使用ASP的
server.htmlencode方法轉換文本為合法的HTML代碼。在ASP頁面中,調用代碼類似如下:?
? :?
| ?
如果選擇了XML文檔的English部分,HTML輸出結果如下:?
First?name:v/td>? 如果選擇了French,HTML輸出結果如下:?
| Prénom: | ?
下圖顯示了French語言版本的表單:?
選擇可用語言?
XML的一大優勢就是它是以清晰的文本格式保存,我們能夠在任何時候更新Web服務器上的XML文件。而且,我們還可以
將English版本的xmltrans.xml文件在XML編輯器XML?NotHPad中打開,復制一份,然后將其中文字翻譯為一種新語言。下圖
顯示了XML?Notepad中的例程文件:?
上圖中,在左邊可以執行添加、刪除以及選擇元素和屬性的操作,在右邊可以編輯相關內容。當站點需要多種語言版
本時,只需要在內容中執行粘貼操作,然后上載最新的XML文檔就可以了。?
為了使添加的語言立即生效,要增加一個程序,用它判斷文件中不同語言的種類數量,并返回語言代碼和語言名稱。
如下面的代碼段所示,我們可以將數據格式化處理以創建一個HTML列表框。當用戶提交表單時,2字母表示的語言種類代碼
被存儲到ASP會話變量choselang中。?
?
添加提示信息以及字符集數據?
上面使用XML提供了HTML表單的可變語言文字顯示,接著還要考慮一些更豐富的用途。比如說,要在選擇語言時添加一
個提示信息,只需要在文字前后嵌入HTML標記