Vincent.Chan‘s Blog

常用链接

统计

积分与排名

网站

最新评论

XSL 学习笔记 —— 基础篇

什么是 XSL?在什么情况下应该使用它?

XSL 之于 XML 就像 CSS 之于 HTML。它是指可扩展样式表语言 (EXtensible Stylesheet Language)。这是一种用于以可读格式呈现 XML 数据的语言。XSL 实际上包含两个部分:

  • XSLT – 用于转换 XML 文档的语言
  • XPath – 用于在 XML 文档中导航的语言

XSLT 是指 XSL 转换 (XSL Transformation),它是 XSL 最重要的部分。

XSLT 可以将 XML 文档转换为其它 XML 文档、XHTML 输出或简单的文本。这通常是通过将每个 XML 元素转换为 HTML 元素来完成的。由于 XML 标签是用户定义的,浏览器不知道如何解释或呈现每个标签,因此必须使用 XSL。XML 标签的意义是为了方便用户(而不是计算机)理解。

XSLT 还可以对 XML 树进行下列操作:

  • 添加和删除元素
  • 添加和删除属性
  • 对元素进行重新排列或排序
  • 隐藏或显示某些元素
  • 查找或选择特定元素

 

XSL 是否与 XML 相同?

既是又不是。说是,是因为它们遵循相同的语法规则(只有少许差异,下面我将会讲到)。说不是,是因为它们的用途不同:XML 用于承载数据,而 XSL 则用于设置数据的格式。XSL 声明与 XML 声明的不同之处在于,XML 声明只写一行,而且没有结束标签,而 XSL 声明必须包含结束标签。

在什么情况下应该使用 XSL?

XSL 在设计时有几个目标用途,这些用途使它成为某些开发情况下的完美解决方案,而对另一些开发情况则毫无用处。

  • XSL 专门用于处理 XML 文档,并且遵循 XML 语法。因此,它只能在支持 XML 的应用程序中与 XML 结合使用。最合适使用 XML 和 XSL 的情况是:Web 门户、新闻聚合器、社区网站或其它任何需要向各种设备及大量客户端提供信息的 Web 应用程序。
  • XSLT 是一种基于模式匹配的语言。它会查找匹配特定条件的节点,然后应用相应的规则。因此,它不具备大多数编程语言的计算能力。例如,XSL 无法在运行时更改变量的值。它不应该用于从使用复杂公式的动态数据源(例如在线商店)来计算值。Web 编程语言更适于此用途。
  • XSL 不能代替或补充 CSS。它不应(也不能)用于设置 HTML 的样式。但是,您可以将其用于需要频繁重新设计可视化效果、频繁更换布局以及以灵活格式处理数据的网站。
  • XSL 不是内容管理工具。它不应(也不能)用于更改 XML 文档的内容或者编辑信息。但是,您可以将 XML 和 XSL 用于需要处理几种不同格式文档的内容管理系统。

服务器端与客户端

服务器端转换工作流程如下图所示:o_fig01.gif

客户端 XSL 转换的工作流程:
o_fig02.gif


什么是 XPath?

XSL 使用 XPath 来标识 XML 树中需要处理的各个元素。

XPath 规范基本上遵循与文件系统寻址相同的规则:

  • 如果 XPath 表达式以斜杠 (/) 开头,代表的是 XML 元素的绝对路径(从 XML 文档的根开始)。
  • 如果 XPath 表达式以双斜杠 (//) 开头,则会选择当前文档中符合指定条件的所有元素,而不考虑它们在 XML 文档中的位置。例如,//employee 会查找 XML 文档中的所有员工节点。
  • 星号 (*) 会选择由前面的路径定位的所有 XML 元素。例如,/company/department/* 选择一个部门的所有子节点,即该部门的所有员工。
  • 点 (.) 选择当前的节点,两个点 (..) 选择父节点。例如,用于选择某个员工所在的部门的 XPath 表达式就是 ../employee
  • 要选择属性,请使用 @ 字符。例如,/company/department/employee[@retired] 选择指定了 retired 属性的所有员工。

过滤项目

使用 <xsl:for-each> 构造,您还可以根据条件过滤输出。假设您只想显示雇员中的程序员。

<xsl:template match="/">
<table border="1">
<tr>
<th>Name</th>
<th>Job</th>
<th>Salary</th>
</tr>
<xsl:for-each select="company/department/employee[job='Programmer']">
<tr>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="job"/></td>
<td><xsl:value-of select="salary"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>

要定义 XML 节点的条件,可以使用下列任何运算符:

  • 等于 (=)
  • 不等于 (!=)例如,name!='Ben Walker'
  • 小于 (<)例如,salary<2750
  • 小于或等于 (<=)
  • 大于 (>)
  • 大于或等于 (>=)

对项目进行排序

可以将项目按字母顺序排列。只需使用 <xsl:sort /> 构造,并指定按哪个节点进行排序。<xsl:sort /> 元素必须嵌套在 <xsl:for-each> 元素中,以确保应用程序可以循环通过所有的项目。使用下面的代码可以按字母顺序显示员工:

<xsl:template match="/">
<table border="1">
<tr>
<th>Name</th>
<th>Job</th>
<th>Salary</th>
</tr>
<xsl:for-each select="company/department/employee">
<xsl:sort select="name" />
<tr>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="job"/></td>
<td><xsl:value-of select="salary"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>

当然,您只需在 <xsl:sort /> 元素中额外添加一个属性,即可方便地在升序和降序排列顺序之间切换:

<xsl:sort select="/name" order="descending"/>

单一条件和多个条件

在大多数语言中,XSL 还能够根据条件显示内容。

单一条件是使用下面的语法定义的:

<xsl:if test="表达式">
</xsl:if>

要对多个项目运行条件测试,以便只显示满足该条件的项目,需要将 xsl:if 构造嵌套在 xsl:for-each 元素中。下面的示例显示了如何只列出薪金高于 2700 元的员工:

<xsl:template match="/">
<table border="1">
<tr>
<th>Name</th>
<th>Job</th>
<th>Salary</th>
</tr>
<xsl:for-each select="company/department/employee">
<xsl:if test="salary &gt; 2700">
<tr>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="job"/></td>
<td><xsl:value-of select="salary"/></td>
</tr>
</xsl:if>
</xsl:for-each>
</table>
</xsl:template>

请注意,小于 (<) 和大于 (>) 符号由它们相应的 HTML 转义序列(&lt 和 &gt)代替。否则,它们很容易与标签的开头和结尾混淆。   

在测试表达式中可以使用常用的条件运算符:

  • &lt(小于)
  • &gt(大于)
  • =(等于)
  • !=(不等于)

如果需要将某个值与某个字符串进行比较,则要将字符串放在单引号中(例如 <xsl:if test="job = 'Software Analyst'">)。

象大多数编程语言中的 IF-ELSE 构造一样,您还可以定义更复杂的条件。所使用的语法一看就能明白:

<xsl:choose>
<xsl:when test="表达式">

</xsl:when>
<xsl:otherwise>

</xsl:otherwise>
</xsl:choose>

为了在多个 XML 节点上测试条件,<xsl:choose> 构造必须嵌套在 <xsl:for-each> 循环中。

假设您要以绿色高亮显示薪金低于 2700 元的所有员工,以蓝色高亮显示薪金高于 2700 元的所有员工:

<xsl:template match="/">
<table border="1">
<tr>
<th>Name</th>
<th>Job</th>
<th>Salary</th>
</tr>
<xsl:for-each select="company/department/employee">
<xsl:choose>
<xsl:when test="salary > 2700">
<tr bgcolor="#66CCFF">
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="job"/></td>
<td><xsl:value-of select="salary"/></td>
</tr>
</xsl:when>
<xsl:otherwise>
<tr bgcolor="#00CC99">
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="job"/></td>
<td><xsl:value-of select="salary"/></td>
</tr>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</table>
</xsl:template>

<xsl:otherwise> 元素指定的是当 XML 节点不满足初始测试条件时默认应用的规则。

posted on 2006-02-13 21:34 Vincent.Chen 阅读(358) 评论(0)  编辑  收藏 所属分类: Java


只有注册用户登录后才能发表评论。


网站导航: