- WML 教程
- WML - 首页
- WML - 概述
- WML - 环境
- WML - 语法
- WML - 元素
- WML - 注释
- WML - 变量
- WML - 格式化
- WML - 字体
- WML - 图片
- WML - 表格
- WML - 链接
- WML - 任务
- WML - 输入
- WML - 提交数据
- WML - 服务器脚本
- WML - 事件
- WML - 定时器
- WML - 模板
- WML - DTD
- WML2 教程
- WML 参考
- WML - 实体
- WML - 标签参考
- WML 有用资源
- WML 快速指南
- WML - 有用资源
- WML - 讨论
WML 快速指南
WML - 概述
WAP(无线应用协议)架构的最顶层由WAE(无线应用环境)组成,WAE包含WML和WML脚本语言。
WML代表**W**ireless **M**arkup **L**anguage(无线标记语言)
WML是XML的一种应用,它在文档类型定义中定义。
WML基于HDML,并进行了修改,以便可以与HTML进行比较。
WML考虑了小屏幕和低带宽传输。
WML是WAP规范中定义的标记语言。
WAP网站是用WML编写的,而网站是用HTML编写的。
WML与HTML非常相似。它们都使用标签,并以纯文本格式编写。
WML文件扩展名为“.wml”。WML的MIME类型为“text/vnd.wap.wml”。
WML支持客户端脚本。支持的脚本语言称为WMLScript。
WML版本
WAP论坛发布了最新版本WAP 2.0。WAP 2.0中定义的标记语言是XHTML Mobile Profile (MP)。WML MP是XHTML的子集。还引入了一种名为WCSS(WAP CSS)的样式表。WCSS是CSS2的子集。
大多数发布的新款手机型号都支持WAP 2.0。因为WAP 2.0向后兼容WAP 1.x,所以支持WAP 2.0的移动设备可以显示XHTML MP和WML文档。
WML 1.x是较早的技术。但这并不意味着它没有用,因为许多仅支持WML 1.x的无线设备仍在使用。WML的最新版本是2.0,它是为了向后兼容性而创建的。因此,WAP网站开发人员无需担心WML 2.0。
WML 卡组和卡片
HTML和WML之间的一个主要区别在于,HTML的基本导航单元是页面,而WML的基本导航单元是卡片。一个WML文件可以包含多个卡片,它们构成一个卡组。
当从手机访问WML页面时,页面中的所有卡片都将从WAP服务器下载。因此,如果用户转到同一卡组的另一张卡片,移动浏览器无需向服务器发送任何请求,因为包含该卡组的文件已存储在无线设备中。
您可以将链接、文本、图像、输入字段、选项框和许多其他元素放在卡片中。
WML程序结构
以下是WML程序的基本结构
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.2//EN" "http://www.wapforum.org/DTD/wml12.dtd"> <wml> <card id="one" title="First Card"> <p> This is the first card in the deck </p> </card> <card id="two" title="Second Card"> <p> Ths is the second card in the deck </p> </card> </wml>
第一行文本说明这是一个XML文档,版本为1.0。第二行选择文档类型并给出文档类型定义(DTD)的URL。
一个WML卡组(即页面)可以包含一个或多个卡片,如上所示。我们将在后续章节中详细了解WML文档结构。
与HTML 4.01 Transitional不同,文本不能直接包含在<card>...</card>标签对中。因此,您需要像上面那样在<p>...</p>中放入内容。
WAP网站设计注意事项
无线设备的显示屏和键盘尺寸有限。因此,在设计WAP网站时务必考虑到这一点。
在设计WAP网站时,您必须确保保持简洁易用。您应该始终记住,没有标准的微型浏览器行为,并且数据链路可能相对较慢,约为10Kbps。但是,使用GPRS、EDGE和UMTS,根据您的位置,这种情况可能不会持续很久。
以下是设计服务时应牢记的一些一般设计技巧
将WML卡组和图像大小保持在1.5KB以下。
保持文本简短且有意义,并尽可能预先编码选项,以最大限度地减少用户数据输入的痛苦体验。
保持URL简短且易于记忆。
最大限度地减少菜单级别,以防止用户迷路并减慢系统速度。
使用标准的布局标签,例如<big>和<b>,并以逻辑方式组织您的信息。
不要过度使用图形,因为许多目标设备可能不支持它们。
WML - 环境
要开发WAP应用程序,您需要以下内容
**支持WAP的Web服务器:**您可以启用Apache或Microsoft IIS来处理所有WAP客户端请求。
**WAP网关模拟器:**这是与WAP服务器交互所必需的。
**WAP手机模拟器:**这是测试WAP页面和显示所有WAP页面所必需的。
您可以使用以下语言编写WAP页面
- 无线标记语言 (WML) 用于开发WAP应用程序。
- WML脚本用于增强WAP应用程序的功能。
配置Web服务器
在普通的Web应用程序中,MIME类型设置为text/html,表示普通的HTML代码。另一方面,图像可以指定为image/gif或image/jpeg等。通过此内容类型规范,Web浏览器知道Web服务器返回的数据类型。
要使您的Apache与WAP兼容,您无需做太多事情。您只需要添加对下面列出的MIME类型和扩展名的支持。
文件扩展名 | MIME类型 |
---|---|
WML(.wml) | text/vnd.wap.wml |
WMLScript(.wmls) | text/vmd.wap.wmlscript |
WMLScriptc(.wmlsx) | application/vnd.wap.wmlscriptc |
WMLC(.wmlc) | application/vnd.wap.wmlc |
WBMP(.wbmp) | image/vnd.wap.wbmp |
配置Apache Web服务器以支持WAP
假设您已经在计算机上安装了Apache Web服务器。现在,我们将告诉您如何在Apache Web服务器中启用WAP功能。
因此,找到Apache的httpd.conf文件(通常位于/etc/httpd/conf中),并将以下几行添加到该文件中,然后重新启动服务器。
AddType text/vnd.wap.wml .wml AddType text/vnd.wap.wmlscript .wmls AddType application/vnd.wap.wmlc .wmlc AddType application/vnd.wap.wmlscriptc .wmlsc AddType image/vnd.wap.wbmp .wbmp
在动态应用程序中,必须动态设置MIME类型,而在静态WAP应用程序中,必须适当地配置Web服务器。
配置Microsoft IIS以支持WAP
要配置Microsoft IIS服务器以提供WAP内容,您需要执行以下操作
- 打开Internet服务管理器控制台,并展开树以查看您的网站条目。您可以将WAP MIME类型添加到整个服务器或各个目录。
- 通过右键单击相应的服务器或目录,然后从菜单中选择“属性”,打开“属性”对话框。
- 在“属性”对话框中,选择“HTTP标头”选项卡,然后选择右下角的“文件类型”按钮。
- 对于前面表格中列出的每个MIME类型,提供带点或不带点的扩展名(它将自动为您添加),然后单击“属性”对话框中的“确定”以接受您的更改。
安装WAP网关模拟器
互联网上有许多WAP网关模拟器可用,因此下载其中任何一个并安装到您的PC上。您需要在启动WAP手机模拟器之前运行此网关。
WAP网关将接收您的请求,并将其传递给Web服务器,从Web服务器接收到的任何响应都将传递给手机模拟器。
您可以从诺基亚网站下载它
诺基亚WAP网关模拟器 - 下载诺基亚WAP网关模拟器。
安装WAP手机模拟器
互联网上有许多WAP模拟器可用,因此下载其中任何一个并安装到您的PC上,您将将其用作WAP客户端。以下是下载模拟器的常用链接
**注意:**如果您有支持WAP的手机,则无需安装此模拟器。但在开发过程中,使用模拟器更方便经济。
WAP模型
我只是为了您的参考提供本节内容,如果您不感兴趣,可以跳过本节。
下图显示了WAP编程模型。请注意它与Internet模型的相似之处。如果没有WAP网关/代理,这两个模型实际上将是相同的。
WAP网关/代理是连接无线域和Internet的实体。您应该注意,从无线客户端发送到WAP网关/代理的请求使用无线会话协议(WSP)。本质上,WSP是HTTP的二进制版本。
无线标记语言(WML)已被采用以开发优化的WAP应用程序。为了节省无线网络中的宝贵带宽,WML可以编码为紧凑的二进制格式。编码WML是WAP网关/代理执行的任务之一。
WAP模型的工作原理?
在实际使用中,WAP的工作方式如下
用户选择其移动设备上的一个选项,该选项分配有包含无线标记语言 (WML) 内容的URL。
手机通过电话网络使用二进制编码的WAP协议将URL请求发送到WAP网关。
网关将此WAP请求转换为指定的URL的常规HTTP请求,并将其发送到Internet。
相应的Web服务器接收HTTP请求。
服务器处理请求,就像处理任何其他请求一样。如果URL引用静态WML文件,则服务器将交付该文件。如果请求CGI脚本,则会对其进行处理,并照常返回内容。
Web服务器将HTTP标头添加到WML内容并将其返回给网关。
WAP网关将WML编译成二进制形式。
然后,网关将WML响应发送回手机。
手机通过WAP协议接收WML。
微型浏览器处理WML并在屏幕上显示内容。
WML - 语法
WML程序通常分为两部分:文档序言和正文。请考虑以下代码
以下是WML程序的基本结构
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.2//EN" "http://www.wapforum.org/DTD/wml12.dtd"> <wml> <card id="one" title="First Card"> <p> This is the first card in the deck </p> </card> <card id="two" title="Second Card"> <p> Ths is the second card in the deck </p> </card> </wml>
WML文档序言
第一行文本说明这是一个XML文档,版本为1.0。第二行选择文档类型并给出文档类型定义(DTD)的URL。引用的DTD在WAP 1.2中定义,但此标题会随WML的版本而更改。必须精确复制标题,以便工具包自动生成此序言。
序言组件不是WML元素,不应关闭,即不应为它们提供结束标签或以/>结束它们。
WML文档正文
主体内容包含在`
Deck(牌组)
Card(卡片)
要显示的内容
导航指令
与HTML 4.01 Transitional不同,文本不能直接包含在<card>...</card>标签对中。因此,您需要像上面那样在<p>...</p>中放入内容。
测试您的程序
将以上代码放入名为test.wml的文件中,并将此WML文件保存在本地硬盘上,然后使用模拟器查看。
这是开发和测试WML文件的最高效方式。但是,由于您的目标是开发一项将提供给WAP手机用户的服务,因此您应该在本地开发完WML文件后将其上传到服务器,并通过真实的互联网连接进行测试。当您开始开发更复杂的WAP服务时,这就是您识别和纠正性能问题的方法,否则这些问题可能会导致您失去网站访问者。
将test.wml文件上传到服务器时,您将测试WML模拟器的外观和行为,并检查Web服务器是否已正确设置。现在启动您的模拟器并使用它访问test.wml的URL。例如,URL可能如下所示:
http://websitename.com/wapstuff/test.wml
注意:访问任何URL之前,请确保WAP网关模拟器正在您的PC上运行。
下载WAP程序后,您将在手机上只看到第一张卡片。以下是诺基亚手机浏览器4.0上上述示例的输出。这款手机支持水平滚动。您可以通过按下“左”或“右”按钮查看屏幕外的文本。
按下右按钮后,第二张卡片将可见,如下所示:
WML - 元素
WML由一组元素定义,这些元素指定WML牌组的所有标记和结构信息。元素由标签标识,每个标签都包含在一对尖括号中。
与HTML不同,WML严格遵守XML层次结构,因此,元素必须包含起始标签;任何内容,例如文本和/或其他元素;以及结束标签。元素具有以下两种结构之一:
`
` 内容 ` `:此形式与HTML相同。`
`:当元素不能包含可见内容或为空时使用,例如换行符。WML文档的序言部分没有任何具有结束元素的元素。
下表列出了大部分有效的元素。所有这些元素的完整详细信息在WML标签参考中给出。
Deck & Card 元素
WML 元素 | 用途 |
---|---|
`` | 定义WML注释 |
` |
定义WML牌组(WML根) |
`` | 定义头部信息 |
`` | 定义元信息 |
` |
定义牌组中的一张卡片 |
` |
定义关于牌组访问控制的信息 |
`` | 为牌组中的所有卡片定义代码模板 |
文本元素
WML 元素 | 用途 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
` ` |
定义换行符 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
` ` |
定义段落 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
`
文本格式化标签
图像元素
锚元素
事件元素
任务元素
输入元素
变量元素
WML - 注释与大多数编程语言一样,WML也提供了一种在代码中放置注释文本的方法。 开发人员使用注释来记录代码中的编程决策,以便更容易维护代码。 WML注释使用与HTML注释相同的格式,并使用以下语法: <!-- This will be assumed as a comment --> 多行注释可以如下给出: <!-- This is a multi-line comment --> WML作者可以在任何地方使用注释,用户代理不会将其显示给用户。如果注释放在XML序言之前,一些模拟器可能会报错。 请注意,注释不会被编译或发送到用户代理,因此不会影响编译后牌组的大小。 WML - 变量因为一个牌组中可以包含多个卡片,所以需要一种机制来保存数据,以便用户在卡片之间切换。这种机制是通过WML变量提供的。 WML区分大小写。解析WML牌组时不执行大小写折叠。所有枚举属性值都区分大小写。例如,以下属性值都不同:id="Card1"、id="card1"和id="CARD1"。 可以使用几种不同的方法创建和设置变量。以下是两个示例: `
|
属性 | 值 | 描述 |
---|---|---|
name | 字符串 | 设置变量的名称 |
value | 字符串 | 设置变量的值 |
class | 类数据 | 为元素设置类名。 |
id | 元素ID | 元素的唯一ID。 |
以下元素将创建一个名为a、值为1000的变量:
<setvar name="a" value="1000"/>
输入元素
变量也通过任何输入元素(如input、select、option等)设置。会自动创建一个与输入元素的命名属性对应的变量。
例如,以下元素将创建一个名为b的变量:
<select name="b"> <option value="value1">Option 1</option> <option value="value2">Option 2</option> </select>
使用变量
变量扩展在运行时在微浏览器或模拟器中发生。这意味着它可以与其他文本连接或嵌入。
变量用前面的美元符号引用,WML牌组中的任何单个美元符号都被解释为变量引用。
<p> Selected option value is $(b) </p>
WML - 格式化
本节将介绍WML的基本文本格式化元素。
换行符
`
` 元素定义换行符,几乎所有WAP浏览器都支持换行符标签。
`
` 元素支持以下属性:
属性 | 值 | 描述 |
---|---|---|
xml:lang | 语言代码 | 设置元素中使用的语言 |
class | 类数据 | 为元素设置类名。 |
id | 元素ID | 元素的唯一ID。 |
以下示例显示`
`元素的用法。
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.2//EN" "http://www.wapforum.org/DTD/wml12.dtd"> <wml> <card title="Line Break Example"> <p align="center"> This is a <br /> paragraph with a line break. </p> </card> </wml>
这将产生以下结果:
文本段落
`
` 元素定义一段文本,WAP浏览器总是换行渲染段落。
需要`
`元素来定义WML中的任何文本、图像或表格。
`
` 元素支持以下属性:
属性 | 值 | 描述 |
---|---|---|
align |
| 用于更改段落的水平对齐方式。 |
mode |
| 设置段落是否应换行。 |
xml:lang | 语言代码 | 设置元素中使用的语言 |
class | 类数据 | 为元素设置类名。 |
id | 元素ID | 元素的唯一ID。 |
以下示例显示`
`元素的用法。
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.2//EN" "http://www.wapforum.org/DTD/wml12.dtd"> <wml> <card title="Paragraph Example"> <p align="center"> This is first paragraph </p> <p align="right"> This is second paragraph </p> </card> </wml>
这将产生以下结果:
WML表格
`
`一起用于在WML中创建表格。WML不允许嵌套表格。
`
以下示例显示`
以下示例显示` `元素的用法。<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.2//EN" "http://www.wapforum.org/DTD/wml12.dtd"> <wml> <card title="Preformatted Text"> <pre> This is preformatted text and will appear as it it. </pre> </card> </wml>
以下示例显示了 ` <?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.2//EN" "http://www.wapforum.org/DTD/wml12.dtd"> <wml> <onevent type="onenterbackward"> <go href="#card3"/> </onevent> <card id="card1" title="Card 1"> <p> <anchor> <go href="#card2"/> Go to card 2 </anchor> </p> </card> <card id="card2" title="Card 2"> <p> <anchor> <prev/> Going backwards </anchor> </p> </card> <card id="card3" title="Card 3"> <p> Hello World! </p> </card> </wml> WML - 定时器前一章描述了用户如何触发事件以及我们如何使用事件处理程序来处理它们。 有时,你可能希望某些事情发生,而无需用户显式激活控件。是的,WML 提供ontimer事件来处理此问题。 当卡片的计时器从一倒计时到零时,将触发 ontimer 事件,这意味着如果计时器初始化为零超时,则不会发生此事件。 你可以使用 ` <onevent type="ontimer"> A task to be performed. </onevent> 这里,任务可以是 ` WML `
|
属性 | 值 | 描述 |
---|---|---|
name | 文本 | 为元素设置名称。 |
value | 数字 | 指定计时器过期后的时间。超时以十分之一秒为单位指定。 |
class | class_data | 为元素设置类名。 |
id | 元素ID | 元素的唯一ID。 |
以下示例显示了 `
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.2//EN" "http://www.wapforum.org/DTD/wml12.dtd"> <wml> <card id="splash" title="splash"> <onevent type="ontimer"> <go href="#welcome"/> </onevent> <timer value="50"/> <p> <a href="#welcome">Enter</a> </p> </card> <card id="welcome" title="Welcome"> <p> Welcome to the main screen. </p> </card> </wml>
加载此程序时,它会显示以下屏幕
如果你没有选择给定的Enter选项,则 5 秒后,你将被定向到Welcome页面,并将自动显示以下屏幕。
WML - 模板
`` 用于将 `
可以通过在 WML 卡片中定义另一个具有相同 `name` 属性值的 `
`` 元素支持以下属性
属性 | 值 | 描述 |
---|---|---|
onenterbackward | URL | 当用户使用“prev”任务导航到卡片时发生 |
onenterforward | URL | 当用户使用“go”任务导航到卡片时发生 |
ontimer | URL | 当“timer”超时时发生 |
class | 类数据 | 为元素设置类名。 |
id | 元素ID | 元素的唯一ID。 |
以下是显示 <go> 元素用法的示例。
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.3//EN" "http://www.wapforum.org/DTD/wml13.dtd"> <wml> <template> <do name="main_menu" type="accept" label="Chapters"> <go href="chapters"/> </do> <do name="menu_1" type="accept" label="Chapter 1"> <go href="#chapter1"/> </do> <do name="menu_2" type="accept" label="Chapter 2"> <go href="#chapter2"/> </do> <do name="menu_3" type="accept" label="Chapter 3"> <go href="#chapter3"/> </do> <do name="menu_4" type="accept" label="Chapter 4"> <go href="#chapter4"/> </do> </template> <card id="chapters" title="WML Tutorial"> <p> Select One Chapter:<br/> <anchor> <go href="#chapter1"/> Chapter 1: WML Overview </anchor><br /> <anchor> <go href="#chapter2"/> Chapter 2: WML Environment </anchor><br /> <anchor> <go href="#chapter3"/> Chapter 3: WML Syntax </anchor><br /> <anchor> <go href="#chapter4"/> Chapter 4: WML Elements </anchor><br /> </p> </card> <card id="chapter1" title="WML Tutorial Ch1"> <p> <em>Chapter 1: WML Introduction</em><br/> ... </p> </card> <card id="chapter2" title="WML Tutorial Ch2"> <p> <em>Chapter 2: WML Environment</em><br/> ... </p> </card> <card id="chapter3" title="WML Tutorial Ch3"> <p> <em>Chapter 3: WML Syntax</em><br/> ... </p> </card> <card id="chapter4" title="WML Tutorial Ch4"> <p> <em>Chapter 4: WML Elements</em><br/> ... </p> </card> </wml>
这将生成以下菜单,现在你可以浏览所有章节
WML - DTD
这是从 W3.org 获取的完整 DTD。有关最新的 DTD,请查看本教程的 WML 有用资源部分。
<!-- Wireless Markup Language (WML) Document Type Definition. WML is an XML language. Typical usage: <?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.2//EN" "http://www.wapforum.org/DTD/wml12.dtd"> <wml> ... </wml> Terms and conditions of use are available from the WAP Forum Ltd. web site at http://www.wapforum.org/docs/copyright.htm. --> <!ENTITY % length "CDATA"> <!-- [0-9]+ for pixels or [0-9]+"%" for percentage length --> <!ENTITY % vdata "CDATA"> <!-- attribute value possibly containing variable references --> <!ENTITY % HREF "%vdata;"> <!-- URI, URL or URN designating a hypertext node. May contain variable references --> <!ENTITY % boolean "(true|false)"> <!ENTITY % number "NMTOKEN"> <!-- a number, with format [0-9]+ --> <!ENTITY % coreattrs "id ID #IMPLIED class CDATA #IMPLIED"> <!ENTITY % ContentType "%vdata;"> <!-- media type. May contain variable references --> <!ENTITY % emph "em | strong |b |i |u |big |small"> <!ENTITY % layout "br"> <!ENTITY % text "#PCDATA | %emph;"> <!-- flow covers "card-level" elements, such as text and images --> <!ENTITY % flow "%text; | %layout; | img | anchor |a |table"> <!-- Task types --> <!ENTITY % task "go | prev | noop | refresh"> <!-- Navigation and event elements --> <!ENTITY % navelmts "do | onevent"> <!--================ Decks and Cards ================--> <!ELEMENT wml ( head?, template?, card+ )> <!ATTLIST wml xml:lang NMTOKEN #IMPLIED %coreattrs; > <!-- card intrinsic events --> <!ENTITY % cardev "onenterforward %HREF; #IMPLIED onenterbackward %HREF; #IMPLIED ontimer %HREF; #IMPLIED" > <!-- card field types --> <!ENTITY % fields "%flow; | input | select | fieldset"> <!ELEMENT card (onevent*, timer?, (do | p | pre)*)> <!ATTLIST card title %vdata; #IMPLIED newcontext %boolean; "false" ordered %boolean; "true" xml:lang NMTOKEN #IMPLIED %cardev; %coreattrs; > <!--================ Event Bindings ================--> <!ELEMENT do (%task;)> <!ATTLIST do type CDATA #REQUIRED label %vdata; #IMPLIED name NMTOKEN #IMPLIED optional %boolean; "false" xml:lang NMTOKEN #IMPLIED %coreattrs; > <!ELEMENT onevent (%task;)> <!ATTLIST onevent type CDATA #REQUIRED %coreattrs; > <!--================ Deck-level declarations ================--> <!ELEMENT head ( access | meta )+> <!ATTLIST head %coreattrs; > <!ELEMENT template (%navelmts;)*> <!ATTLIST template %cardev; %coreattrs; > <!ELEMENT access EMPTY> <!ATTLIST access domain CDATA #IMPLIED path CDATA #IMPLIED %coreattrs; > <!ELEMENT meta EMPTY> <!ATTLIST meta http-equiv CDATA #IMPLIED name CDATA #IMPLIED forua %boolean; "false" content CDATA #REQUIRED scheme CDATA #IMPLIED %coreattrs; > <!--================ Tasks ================--> <!ELEMENT go (postfield | setvar)*> <!ATTLIST go href %HREF; #REQUIRED sendreferer %boolean; "false" method (post|get) "get" enctype %ContentType; "application/x-www-form-urlencoded" accept-charset CDATA #IMPLIED %coreattrs; > <!ELEMENT prev (setvar)*> <!ATTLIST prev %coreattrs; > <!ELEMENT refresh (setvar)*> <!ATTLIST refresh %coreattrs; > <!ELEMENT noop EMPTY> <!ATTLIST noop %coreattrs; > <!--================ postfield ================--> <!ELEMENT postfield EMPTY> <!ATTLIST postfield name %vdata; #REQUIRED value %vdata; #REQUIRED %coreattrs; > <!--================ variables ================--> <!ELEMENT setvar EMPTY> <!ATTLIST setvar name %vdata; #REQUIRED value %vdata; #REQUIRED %coreattrs; > <!--================ Card Fields ================--> <!ELEMENT select (optgroup|option)+> <!ATTLIST select title %vdata; #IMPLIED name NMTOKEN #IMPLIED value %vdata; #IMPLIED iname NMTOKEN #IMPLIED ivalue %vdata; #IMPLIED multiple %boolean; "false" tabindex %number; #IMPLIED xml:lang NMTOKEN #IMPLIED %coreattrs; > <!ELEMENT optgroup (optgroup|option)+ > <!ATTLIST optgroup title %vdata; #IMPLIED xml:lang NMTOKEN #IMPLIED %coreattrs; > <!ELEMENT option (#PCDATA | onevent)*> <!ATTLIST option value %vdata; #IMPLIED title %vdata; #IMPLIED onpick %HREF; #IMPLIED xml:lang NMTOKEN #IMPLIED %coreattrs; > <!ELEMENT input EMPTY> <!ATTLIST input name NMTOKEN #REQUIRED type (text|password) "text" value %vdata; #IMPLIED format CDATA #IMPLIED emptyok %boolean; "false" size %number; #IMPLIED maxlength %number; #IMPLIED tabindex %number; #IMPLIED title %vdata; #IMPLIED accesskey %vdata; #IMPLIED xml:lang NMTOKEN #IMPLIED %coreattrs; > <!ELEMENT fieldset (%fields; | do)* > <!ATTLIST fieldset title %vdata; #IMPLIED xml:lang NMTOKEN #IMPLIED %coreattrs; > <!ELEMENT timer EMPTY> <!ATTLIST timer name NMTOKEN #IMPLIED value %vdata; #REQUIRED %coreattrs; > <!--================ Images ================--> <!ENTITY % IAlign "(top|middle|bottom)" > <!ELEMENT img EMPTY> <!ATTLIST img alt %vdata; #REQUIRED src %HREF; #REQUIRED localsrc %vdata; #IMPLIED vspace %length; "0" hspace %length; "0" align %IAlign; "bottom" height %length; #IMPLIED width %length; #IMPLIED xml:lang NMTOKEN #IMPLIED %coreattrs; > <!--================ Anchor ================--> <!ELEMENT anchor ( #PCDATA | br | img | go | prev | refresh )*> <!ATTLIST anchor title %vdata; #IMPLIED accesskey %vdata; #IMPLIED xml:lang NMTOKEN #IMPLIED %coreattrs; > <!ELEMENT a ( #PCDATA | br | img )*> <!ATTLIST a href %HREF; #REQUIRED title %vdata; #IMPLIED accesskey %vdata; #IMPLIED xml:lang NMTOKEN #IMPLIED %coreattrs; > <!--================ Tables ================--> <!ELEMENT table (tr)+> <!ATTLIST table title %vdata; #IMPLIED align CDATA #IMPLIED columns %number; #REQUIRED xml:lang NMTOKEN #IMPLIED %coreattrs; > <!ELEMENT tr (td)+> <!ATTLIST tr %coreattrs; > <!ELEMENT td ( %text; | %layout; | img | anchor |a )*> <!ATTLIST td xml:lang NMTOKEN #IMPLIED %coreattrs; > <!--============ Text layout and line breaks =============--> <!ELEMENT em (%flow;)*> <!ATTLIST em xml:lang NMTOKEN #IMPLIED %coreattrs; > <!ELEMENT strong (%flow;)*> <!ATTLIST strong xml:lang NMTOKEN #IMPLIED %coreattrs; > <!ELEMENT b (%flow;)*> <!ATTLIST b xml:lang NMTOKEN #IMPLIED %coreattrs; > <!ELEMENT i (%flow;)*> <!ATTLIST i xml:lang NMTOKEN #IMPLIED %coreattrs; > <!ELEMENT u (%flow;)*> <!ATTLIST u xml:lang NMTOKEN #IMPLIED %coreattrs; > <!ELEMENT big (%flow;)*> <!ATTLIST big xml:lang NMTOKEN #IMPLIED %coreattrs; > <!ELEMENT small (%flow;)*> <!ATTLIST small xml:lang NMTOKEN #IMPLIED %coreattrs; > <!ENTITY % TAlign "(left|right|center)"> <!ENTITY % WrapMode "(wrap|nowrap)" > <!ELEMENT p (%fields; | do)*> <!ATTLIST p align %TAlign; "left" mode %WrapMode; #IMPLIED xml:lang NMTOKEN #IMPLIED %coreattrs; > <!ELEMENT br EMPTY> <!ATTLIST br %coreattrs; > <!ELEMENT pre (#PCDATA | a | br | i | b | em | strong | input | select )*> <!ATTLIST pre xml:space CDATA #FIXED "preserve" %coreattrs; > <!ENTITY quot """> <!-- quotation mark --> <!ENTITY amp "&"> <!-- ampersand --> <!ENTITY apos "'"> <!-- apostrophe --> <!ENTITY lt "<"> <!-- less than --> <!ENTITY gt ">"> <!-- greater than --> <!ENTITY nbsp " "> <!-- non-breaking space --> <!ENTITY shy ""> <!-- soft hyphen (discretionary hyphen) -->
WML2 教程
WML2 是一种扩展以下内容的语法和语义的语言
- XHTML Basic [XHTMLBasic]
- CSS Mobile Profile [CSSMP]
- WML1.0 的唯一语义 [WML1.0]
WML2 针对在移动电话和其他无线移动终端等能力有限的设备上指定演示文稿和用户交互进行了优化。
本教程详细介绍了无线标记语言 (WML) 版本 2。本教程将 WML 的 2.0 版本称为 WML2。
W3C 定义的 XHTML Basic 是 XHTML 的一个适当子集,XHTML 是 HTML 在 XML 中的重新制定。
WML2 的基本目标
WML2 有五个主要目标
向后兼容性:WML2 应用程序也应该在旧设备上运行。
与现有和不断发展的互联网标准融合:XHTML Basic [XHTMLBasic] 和 CSS Mobile Profile [CSSMP]
优化从小巧、有限的设备访问:支持 WAP 的设备通常很小且电池供电,并且内存和 CPU 能力相对有限。因此,WML2 应该足够优化才能在这些设备上运行。
允许创建不同的用户界面:WAP 允许创建具有最大灵活性和厂商增强用户体验能力的人机界面 (MMI)。
体系结构的国际化:WAP 针对国际使用常见的字符代码。这包括供最终用户使用的国际符号和象形图集,以及供内容开发者使用的本地使用字符编码。
WML2 愿景
WML2 的愿景是创建一种语言,该语言使用 WML1 的唯一语义扩展 XHTML Basic 和 CSS Mobile profile 的语法和语义。用户不应知道如何实现 WML1 兼容性。
WML2 语言结构
WML2 是一种具有以下组件的新语言
(1) XHTML Basic
此元素组用于 W3C 融合。对于某些元素,添加了 WML 扩展属性以实现 WML1 功能。
(1a) XHTML Basic 元素
a abbr acronym address base blockquote br caption cite code dd dfn div dl dt em form h1 h2 h3 h4 h5 h6 head kbd label li link object ol param pre q samp span strong table td th title tr ul var
(1b) 带有 WML 扩展属性的 XHTML Basic 元素
body html img input meta option p select style textarea
(2) XHTML 模块化元素
此元素组由 XHTML 模块中未包含在 XHTML Basic 中的选定元素组成。大多数元素都包含在内,用于与 WML1 向后兼容。包含一个元素作为适合有限手机功能的增强功能。
(2a) 用于与 WML1 向后兼容的 XHTML 模块化
b big i small(来自演示文稿模块)u(来自旧版模块)fieldset optgroup(来自表单模块)
(2b) 用于功能增强的 XHTML 模块化元素
hr
(3) WML 扩展元素
一些元素来自 WML1,因为 XHTML Basic 或 XHTML 模块化中没有提供等效的功能。包含一个元素是为了增强 WML1 功能。
(3a) WML 扩展元素(用于 WML1 兼容性)
wml:access wml:anchor wml:card wml:do wml:getvar wml:go wml:noop wml:onevent wml:postfield wml:prev wml:refresh wml:setvar wml:timer
(3b) WML 扩展元素(用于功能增强)
wml:widget
WML 文档结构模块
结构模块中的以下元素用于指定 WML2 文档的结构
- body
- html
- wml:card
- head
- title 属性
body 元素
wml:newcontext 属性指定加载文档时浏览器上下文是否初始化为明确定义的状态。如果 wml:newcontext 属性值为“true”,则浏览器必须在此卡片导航时重新初始化浏览器上下文。
html 元素
xmlns:wml 属性引用 WML 命名空间,例如:http://www.wapforum.org/2001/wml。
wml:use-xml-fragments 属性用于指定用户代理如何解释片段标识符。有关在 go 任务和 prev 任务中使用 wml:use-xml-fragments 的详细信息。
wml:card 元素
wml:card 元素指定文档正文的一部分。多个 wml:card 元素可以出现在单个文档中。每个 wml:card 元素代表与用户的单个演示文稿和/或交互。
如果 wml:card 元素的 newcontext 属性值为“true”,则浏览器必须在此卡片导航时重新初始化浏览器上下文。
head 元素
此元素保留文档的标题信息,如 meta 元素和样式表等。
title 元素
此元素用于设置文档标题
注意:WML 开发人员可以使用 XHTML 文档样式(即主体结构),也可以使用卡片集合。使用主体结构时,文档使用 body 元素构建。body 元素包含文档的内容。使用卡片集合时,文档使用一个或多个 wml:card 元素构建。
WML2 任务
WML2.0 中定义了以下任务。这些任务与 WML1.0 非常相似。
- go 任务
- prev 任务
- noop 任务
- refresh 任务
WML2 事件
WML2 中定义了以下事件类型
内在事件:由用户代理生成的事件,包括以下与 WML1.0 相似的事件。
- ontimer
- onenterforward
- onenterbackward
- onpick
外在事件:由某些外部代理发送给用户代理的事件。WML 2 规范未指定任何外在事件类别。WML 外在事件类别的一个示例可能是 WTA 事件。
WML2 文档类型
WML2 文档由 MIME 媒体类型“application/wml+xml”标识。“application/xhtml+xml”类型可用于标识来自任何基于 XHTML 的标记语言(包括 XHTML Basic)的文档。
DOCTYPE 声明可以包含 XHTML Basic 正式公共标识符,也可以包含 XHTML Basic DTD 的 URI,如下所示。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">
WML2 与样式表
样式表可用于设置 WML2 文档的样式。样式信息可以通过三种方式与文档关联。
外部样式表
可以使用特殊的 XML 处理指令或 link 元素将外部样式表与文档关联。也可以使用 XML 处理指令。
在以下示例中,使用 XML 处理指令来关联外部样式表“mobile.css”。
<?xml-stylesheet href="mobile.css" media="handheld" type="text/css" ?>
在以下示例中,使用 link 元素关联外部样式表“mystyle.css”。
<html> <head> <link href="mystyle.css" type="text/css" rel="stylesheet"/> ... </head> ... </html>
内部样式表
可以使用 style 元素在文档中定位样式信息。此元素与 link 元素一样,必须位于文档头部。
以下是内部样式表的示例。
<html> <head> <style type="text/css"> p { text-align: center; } </style> ... </head> ... </html>
内联样式
可以使用style属性为单个元素指定样式信息。这称为内联样式。
在以下示例中,内联样式信息应用于特定的段落元素。
<p style="text-align: center">...</p>
WML2 默认样式表
这是一个 WML 2.0 的样式表示例。
body, card, div, p, center, hr, h1, h2, h3, h4, h5, h6, address, blockquote, pre, ol, ul, dl, dt, dd, form, fieldset, object { display: block } li { display: list-item } head { display: none } table { display: table } tr { display: table-row } td, th { display: table-cell } caption { display: table-caption } th { font-weight: bolder; text-align: center } caption { text-align: center } h1, h2, h3, h4, h5, h6, b, strong { font-weight: bolder } i, cite, em, var,address { font-style: italic } pre, code, kbd, pre { white-space: pre } big { font-size: larger} small { font-size: smaller} hr { border: 1px inset } ol { list-style-type: decimal } u { text-decoration: underline }
WML2 元素
这是一个指向所有 WML2 元素完整列表的链接。大多数元素都可以在 XHTML 规范中找到,除了少数以WML:开头的元素。这些元素是 WML 特有的。
所有具有相同含义的元素在这里与它们在 XHTML 规范中的含义相同。
WML2 标签参考总结
我们可以得出结论,如果您了解 XHTML 和 WML1.0,那么您无需学习 WML2.0。
如果您有兴趣进一步阅读,您可以在此处找到WAP2.0 和 WML2.0的完整规范。
WML - 实体
WML 实体用于表示难以键入或在 WML 中具有特殊含义的符号。
例如,如果您将 < 字符正常地放入文本中,浏览器会认为它是标签的开始;然后,当找不到匹配的 > 字符来结束标签时,浏览器会报错。
下表显示了 WML 中实体的三种形式。命名实体可能是您从 HTML 中熟悉的:它们看起来像 & 或 <,它们通过助记名表示单个命名字符。实体也可以以两种数字形式(十进制或十六进制)输入,允许您将任何 Unicode 字符输入到 WML 中。
命名实体 | 十进制实体 | 十六进制实体 | 字符 |
---|---|---|---|
" | " | " | 双引号 (") |
& | & | & | 和号 (&) |
' | ' | ' | 撇号 (') |
< | < | < | 小于号 (<) |
> | > | > | 大于号 (>) |
|   |   | 不换行空格 |
­ | ­ | ­ | 软连字符 |
请注意,所有实体都以和号 (&) 开头,以分号 (;) 结尾。这个分号非常重要:有些网页忘记了这一点,并导致希望获得正确 HTML 的浏览器出现问题。WAP 浏览器也可能对这类错误更严格。
WML - 标签参考
下表列出了所有有效的 WML 元素。点击链接以了解更多关于该元素的详细信息。
Deck & Card 元素
WML 元素 | 用途 |
---|---|
`` | 定义WML注释 |
<wml> | 定义WML牌组(WML根) |
`` | 定义头部信息 |
`` | 定义元信息 |
` |
定义牌组中的一张卡片 |
` |
定义关于牌组访问控制的信息 |
`` | 为牌组中的所有卡片定义代码模板 |
文本元素
WML 元素 | 用途 | |||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
` ` |
定义换行符 | |||||||||||||||||||||||||||
` ` |
定义段落 | |||||||||||||||||||||||||||
`
文本格式化标签图像元素
锚元素事件元素
任务元素输入元素变量元素WML - WAP 模拟器无需安装完整的 WAP SDK,您可以安装 WML 模拟器。模拟器只需让您查看 WML 文件的内容,就像它们在支持 WAP 的设备屏幕上显示一样。 虽然模拟器做得很好,但它们并不完美。尝试几个不同的模拟器,您很快就会决定哪个最适合您。当需要开发真实的(商业)WAP 网站时,您需要进行更多测试,首先使用其他 SDK/模拟器,然后使用您计划支持的所有支持 WAP 的设备。 以下是列出的一些免费提供的 WAP 模拟器。
WML 验证器验证 WML 内容将 WML 内容复制并粘贴到下面的框中,然后单击验证 WML以查看此页面底部的结果。 验证 WML 文件输入您的 WML 页面 URL,然后单击验证 WML以查看此页面底部的结果。 广告
|