什么是 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 用于需要处理几种不同格式文档的内容管理系统。
服务器端与客户端
服务器端转换工作流程如下图所示:
客户端 XSL 转换的工作流程:
什么是 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 > 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 转义序列(< 和 >)代替。否则,它们很容易与标签的开头和结尾混淆。
在测试表达式中可以使用常用的条件运算符:
- <(小于)
- >(大于)
- =(等于)
- !=(不等于)
如果需要将某个值与某个字符串进行比较,则要将字符串放在单引号中(例如 <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 2005-11-16 11:43
鱼上游 阅读(1357)
评论(3) 编辑 收藏 所属分类:
爪哇友邻真不少