答案:元素和标签是wml的主要语法,它们决定了wml编程的基本规则。本章我们就从wml的元素、标签、属性等方面详细讲解wml的编程方法。学习本章知识之前,读者应当了解wml元素与标签的区别。wml的元素通常由一个首标签、内容、其他元素及一个尾标签组成,元素也可以不含有内容。不包含内容的元素称为空元素,它退化成一个单独的标签。也就说,单独的标签是一个元素,成对出现的标签与其包含的内容也构成一个元素。由于元素涉及标签,标签又涉及属性,所以我们本章各节均以元素为主线,通过大量实例分别从卡片与卡片组、事件、任务、变量、用户输入、锚点、图像、时间控制、文本格式等几个方面进行讲解。
卡片、卡片组及其元素
我们前面已经多处介绍过wml的卡片与卡片组,主要从概念和相互关系的角度进行了分析。我们这里则从卡片、卡片组的组成、相关元素、标签及属性等编程角度进行分析和讲解。6.1.1 共有属性
wml元素的共有属性主要有3个,即id、class和xml:lang属性。wml的所有元素都有两个核心属性,即标识(id)和类(class)属性。它们主要用于服务器方的信息传输。其中,id属性用于定义元素在卡片组中的唯一标识,即它的名称;class属性用于给当前元素定义一个或更多的类(class)。与卡片组一样,类(class)也是有名字的,而且多个元素可以使用一个类(class)名。具有相同类名的单一卡片组中的所有元素均可被看作相同类的一个部分。类名是区分大小写的。如果在class属性列表中,一个元素具有多个唯一的类名,那么该元素可以看作这些类中的一部分。具有同一属性的多个类名必须用两个以上的空格间隔,wml程序执行时将忽略其中多余的类名及其属性。
另外,在wml程序,所有包含文本的元素均具有“xml:lang”属性。该属性用于指定当前元素及其属性所用的描述语言,如英国英语、美国英语、法语、德语等,并可以为用户浏览器选择显示文本的语言提供依据。
6.1.2 wml程序的文件头
合法的wml卡片组均属合法的xml文件,因此它必须包含xml的声明及文件类型的声明。典型的wml程序的文件头包括我们前面多次提到的以下两行程序:<?xml version="1.0"?>
<!doctype wml public "-//wapforum//dtd wml 1.1//en" "http://www.wapforum.org/dtd/ wml_1.1.xml">
编写wml程序时,我们必须写入这两行程序,并放在程序开始的第1、2行。其中,“-//wapforum//dtd wml 1.1//en”是标准通用标记语言sgml(standard generalized markup language)的公共标识;“http://www.wapforum.org/dtd/wml_1.1.xml”是wml程序文档类型的标识。文档类型标识也可以是“text/vnd.wap.wml”或“application/vnd.wap. wmlc”,其中前者指定wml的原文类型,后者指定wml程序编译后代码类型。
6.1.3 wml元素
wml的wml元素用于定义一个卡片组,并通过<wml>与</wml>标签包含和封装该卡片组中的所有卡片及信息。它的语法格式如下:<wml xml:lang="lang" >
内容(content)
</wml>
其中xml:lang="lang"用于指定文档所用语言(前面已有介绍),语言"lang"的值属于nmtoken型数据。
wml元素中包含的内容(content)中除了文本、图像等信息之外,还可以包含head、template及card元素。其中head、template元素如果包含的话则只可包含一次,而card元素必须至少包含一次。有关这些元素的用法我们后面介绍。
下面给出的例程中,wml元素中包含了一个由两个卡片构成的卡片组:
<wml xml:lang="en-us">
<card id="card1" title="card 1">
<do type="accept">
<go href=>
</do>
<p>
hello world!
this is the first card...
图6.1 wml元素应用举例
</p></card>
<card id="card2" title="card 2">
<p>
this is the second card.
goodbye.
</p>
</card>
</wml>
程序第1行中的xml:lang属性用于指定文档使用美国英语("en-us")编写。运行该程序时,它将先在wap用户的手机浏览器上显示第1个卡片,当用户激活do元素后,则显示第2个卡片,效果如图6.1所示。
6.1.4 template元素
template元素用于为当前卡片组中的所有卡片定义一个模板,统一规定卡片的某些参数。模块中的事件处理功能则可将这些参数自动应用于同一卡片组中的所有卡片。不过,我们也可以使其中某个或某几个卡片不采用模板规定的形式,方法是在该卡片中定义一个同名的事件来替代模块中相应的事件。template元素是通过<template>和</template>标签包含所需内容(content)而实现模板功能的,其语法格式如下:<template onenterforward="href" onenterbackward="href" ontimer="href" >
内容(content)
</template>
template元素包含的内容中,除了卡片的一般参数外,还可以包含任意多次的do元素和onevent元素。template元素各属性的功能及用法说明如下:
(1) onenterforward。当用户在浏览器中进入当前卡片时,该属性将指定超链(href)的url地址,浏览器将据此打开url指定的卡片或事件。
(2) onenterbackward。与上一属性类似,该属性也可以指定其相应卡片或事件的url地址。如果用户浏览时执行prev任务,那么浏览器就会定位到该属性所指定超链(href)的url地址,
并打开url指定的卡片或事件。(3) ontimer。当指定时间timer过期的时候,用户浏览器就根据ontimer属性指定的url打开相应的卡片。
有关onenterforward事件、onenterbackward事件和ontimer事件的详细情况我们后面将专门介绍。
下面举出的关于template元素的例子中,包含有一个do元素,指定当用户选择prev按钮功能时,就打开浏览的前一个卡片:
<template>
<do type="prev" label="previous">
<prev/>
</do>
</template>
下面的例子稍微复杂一些。程序开始定义了一个模板,包含do元素,指定当用户从选项(options)中选择“do1”时,打开系统默认的卡片。随后,程序定义了卡片“first”,它自动套用了刚刚定义的模板。接下来,程序又定义了卡片“second”,并使用同
<wml>
<template>
<do type="options" name="do1" label="default">
<prev/>
</do>
</template>
<card id="first">
<!--该卡片将自动套用模板中定义的事件处理过程-->
…
</card>
<card id="second">
<!--该卡片使用同名的事件处理替代了模板中提供的事件处理-->
<do type="options" name="do1" label="options>
<go href=>
</do>
…
</card>
</wml>
上一个:WML与URL、程序段锚点
下一个:[小结]WML元素及其语法格式一览表(1)