Wireless Markup Language - WML是WAP中用來描述與展現資料用的語言,如同HTML與HTTP協定間的定位一般;如果你熟悉Html相信你會很快入手並愛上它
WML與XML
WML是類似HTML的標語言,不同的是WML基礎是Extensible Markup Language (XML),而非Html的基礎Standard Generalized Markup Lanuage (SGML),不過XML也正是SGML的變形;本文我們不討論SGML與XML的差異,只說明撰寫WML所需要的XML基礎知識,並首先,我們先來看看下面這個基本的WML原始碼:
<wml>
<head>
<meta http-equiv="cache-control" content="max-age=0"/>
</head>
<template>
<do type="options" label="help">
<go href="help.wml"/>
</do>
</template>
<card>
This is a card.
</card>
</wml>
以"<"與">"所構成的語法,是XML的基本文法,而以<標>開頭,包含內文,再以</標>結束的格式,我們稱之為標-Tag,XML的基本元素;由於構成WML的語法是基礎於XML,因此它與以SGML的HTML有著明顯不同,它是大小寫有別的,並且大部份的標名稱是以小寫為主,因此<card>不等於<Card>,你也不能以<card></Card>構成一個標元素。而所有的標,若無成對,也就是只有開頭的單對標,必須以<標/>格式,表示自已是開頭也是結尾,例如Html中的<BR>在WML就必須是<br/>。
既然稱標為元素,標就如同細胞,集合而構成WML文件,再構成WAP軟體系統,而XML的地位就如同DNA一般,定義了所有元素的基本可能型式。首先我們來談談WML的DNA-XML的概念。首先,在XML中標是由一個名稱構成,例如<card>,我們就稱之為card標,視它為一個基本單位-元素,而每個標開頭與結尾之間,我們稱之為內文;內文之中,可能包含兩種基本常見的元素-標與字串;利用標中能再包含標或字串的特性,雖然簡單,但卻可以構成許多雜的XML文件,如同細胞雖簡單,但卻構成了雜的人類一般。雖然標如同細胞,同類的細胞大致相同,但是為了能有彈性的特色變化,XML語法中允許你利用屬性值(attribute)給予標更細節的說明,例如前面的例子中的meta標使用中,便使用到了http-equiv與content兩個屬性值;所以你應該很容易了解標屬性值的語法便是在開頭標的<>內部指定,以空白做為格的“鍵名-鍵值”(key-value)對構成,鍵值必須以雙引號或單引號左右包括起來以示區別;在WML規中,標中的某些屬性值是必須的,否則是錯誤的文法,例如前面例子中的go標的href屬性。不要將Html中允許簡化而不在鍵值左右加上引號的壞習慣帶來,這在XML文法中是不允許的。
XML雖然規了標的組合方式,但是WML規格會給允每個具有義意的標(如同前面的例中的wml、template、card,等等...)一定的規格,也就是說什麽樣的標有什麽樣的意義,標能包含什麽樣的標,都有其規存在,而不是雜亂無章的;例如,我們拿前面的WML原始碼例來看,WML對wml所能包含的內文規就如同以下:
圖表 1、標的內文屬性
元素 包含
<head> 無或包含一個
<template> 無或包含一個
<card> 包含一個或一個以上
這樣的規格制定方式,在XML中是以Document Type Definition DTD來定義的,因此WML也有它語法對映的DTD格,我們抽取其中制定wml標的部份來看:
<!ELEMENT wml ( head?, template?, card+ )>
XML的文件構成,如果以分析的角度來看,便如同一個樹狀的資料結構:
wml標包含了head、template與card三個標,每個標或字串在這資料結構中,被視為一個節點,而身為最頂端的節點-<wml>,即為整個樹狀結構資料的WML文件的根,這是WML文件的第一個標開頭。接下來,wml標所能包含的內文可以是依順序head、template與card標,在DTD中的語法中,你應該很容易了解它的意義與使用方法,在上面的DTD語法中ELEMENT後所接的便是欲描述的標,構成的標名旁加“?”表示“無或包含一個”,而“+”表示“包含一個或一個以上”,若旁邊沒加任何符號,則表示“正好一個”,你可以參考圖表1來了解其間的關。
WML的顯示
wml標中head與template是非必要性的標,我們稍後再討論;而card標是整個WML文件內容的主要所在,如同HTML語法中的body標一般,所有可見的內容都在這裡;card所能包含的文字與圖型控制標,與Html語法類似。這些文字控制標該怎麽應用呢?例如:
<card id="main" title="Hello World">
<p>
<i>Hello WAP World.</i>
</p>
<p>
This is my first <br/><b>WML</b> example.
</p>
</card>
下面則是WML顯示幕上你可能看到的情形
card裡包含了兩個p標(功用在於區分段落),所以被包含的“Hello WAP world”與“This is my first WML example”便會被分段開來;而i標與b標所包含的文字分別會以斜體與粗體顯示。上面所談到的標都是文字格式化的標,與Html類似,共有:
標 用途解釋
em 將字體強調
strong 將字體加強強調
i 將字體變成斜體
b 將字體變成粗體
u 將字體加上底線
big 使用較大的字體
small 使用較大的字體
分頁的文件格式
但是,card不同於body標的地方是Html標只能包含一個body,而wml標卻能包含一個以上的card標,這樣設計上的差異主要是WML文件的顯示器通常是行動電話之類的小型顯示幕,受限於顯示空間,而將WML文件(Deck)設計成可以包含多個頁面(card)的格式。這樣的設計格局:
這樣的設計格局,顯示出WML文件以數張牌構成,而以將文件的構成稱為一副牌;因此WML的顯示端,同時間只會顯示一個牌面,為了牌面間的外換,WML藉由鏈結來達成,與Html的內部鏈結切換方式一樣;這樣的設計無非是為了在小型的顯示器上有較好的浏覽效果。
在下面是一個例:
<?XML version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.XML">
<!-- Main menu for WML examples -->
<wml>
<card id="card1">
<p>
Links Demo:
</p>
<p>
Go to <a href="#card2">card2</a> of this deck.
<br/>
Go to another <a href="deck.wml">deck</a>.
</p>
</card>
<card id="card2">
<p>
Go back to <a href="#card1">card1</a> of this deck.
</p>
</card>
</wml>
下面是它的執行結果,同樣的,也是與WML顯示器有關,呈現方式也不一定:
a是表示超鏈結的標,而其屬性href則是指向超鏈結位置,而以 "#card_id"的href值,則表示該deck中的某個id相符的card,選取這個超鏈結便會切換到該card;這樣的切換方式也與Html類似,所以也不難猜到你可以用href=”url_link#card” 來指向某WML中的某個card。
第一階段的WML教學到此結束,WML與HTML不光是單方面的資料浏覽功能,而是要有與Html功能相近的表單功能來達成與使用者的雙向溝通能力,下一篇教學文章我們將會把重點放在這裡。