### 跟我学 XSL（二）

XSL 入门
上期我们讲到用 CSS（层叠样式表）来格式化 XML 文档，其效果并不很令人满意。实际上 CSS 用来格式化 HTML 标记比较合适些，只是因为它简单才在上例中采用。
XML 在更多的时候只是一种数据文件，怎样将它变为我们日常所看到的 HTML 格式那样的文件呢？如果我们将 XML 文件比作结构化的原料的话，那么 XSL 就好比“筛子“与“模子“，筛子选取自己需要的原料，这些原料再通过模子形成最终的产品：HTML。
这个模子大致是这样：我们先设计好表现的页面，再将其中需要从 XML 中获取数据来填充内容的部分“挖掉“，然后用 XSL 语句从 XML 中筛出相关的数据来填充。一言以譬之：这 XSL 实际上就是 HTML 的一个“壳子“，XML 数据利用这个“壳“来生成“传统“的 HTML。
XML 在展开时是一个树形结构，我们将树形结构中自定义标记称为节点，节点之间存在父子、兄弟关系，我们要访问其中的结点从根结点就要以”／”来层层进入。
在 XSL 这个壳中，我们要从原料库？？XML 里提取相关的数据，就要用到 XSL 提供的模式化查询语言。所谓模式化查询语言，就是通过相关的模式匹配规则表达式从 XML 里提取数据的特定语句，即我们上所说的“筛子“。
参考微软的”XSL 开发者指南”，我们大致可将模式语言分为三种：
选择模式
< xsl:for-each >、< xsl:value-of >,和 < xsl:apply-templates >
测试模式
< xsl:if > 和< xsl:when >
匹配模式
< xsl:template >
我们现在就分别对之进行介绍。
一、 选择模式
选择模式语句将数据从 XML 中提取出来，是一种简单获得数据的方法，这几个标记都有一个 select 属性，选取 XML 中特定的结点名的数据。
1、< xsl:for-each >
如在 XML 中有这样的数据:
< author >
< name >小禹< /name >
< name >春华< /name >
< name >秋实< /name >
< /author >
我们要读取这三个作者名字，是一个一个地按”author/name”方法来读取吗，可有多个这样的 name 呀？如果有一种程序性的语句来循环读取有多好啊！
想得很对，XSL 提供了这样的具有程序语言性质的语句< XSL:for-each >
用它读取这三个作者名字的方法如下:
< xsl:for-each select=”author/name” >
…….
< ./xsl:for-each >
select，顾名思义：选取，它可以选定 XML 中特定唯一的标记，也可以选择某一类相同的标记，我们称之为结点集。
语法：
< xsl:for-each select="pattern" order-by="sort-criteria-list">
属性：
1. select
根据 XSL 样式查询考察上下文以决定哪类结点集（满足 select 条件）使用此样式描述。作为一种简化的表示就是，如果你想对文档中的某一种标记的内容的显示方式进行格式化，就可以将让 select 等于此元素的标记名。例如欲对标记 xml_mark 进行格式化，即可用如下方式表示：
< xsl:for-each select="xml_mark" >
< !--样式定义-- >
< /xsl:for-each >
2. order-by
以分号（;）分隔、作为排序标准的列表。在列表元素前添加加号（+）表示按此标记的内容以升序排序，添加减号（-）表示逆序排序。作为一种简化的表示就是，排序标准列表就是由 select 规定的标记的子标记的序列，每个标记之间以（;）分隔。
2、< xsl:value-of >
< xsl:for-each >模式只是选取节点，并没有取出节点的值，好比猴子只是爬到了树的某个枝干上，那么就用< xsl:value-of >来摘“胜利果实“吧！
语法：
< xsl:value-of select="pattern" >提取节点的值
属性：
select 用来与当前上下文匹配的 XSL 式样。简单的讲，如果要在 XSL 文档某处插入某个 XML 标记（假定是 xml_mark 标记）的内容，可用如下方式表示：
< xsl:value-of select="xml_mark" >< /xsl:value-of >
或
< xsl:value-of select="xml_mark"/ >
示例：
此处仍以上期的个人简历的作为例子，我们需要对文件（个人简历.xml）作一定修改，确切的说是将其中的第二行
< ?xml:stylesheet type="text/css" href="resume.css"? >
修改为
< ?xml:stylesheet type="text/xsl" href="resume.xsl"? >
然后建立一个新文件：resume.xsl，其内容如下：
< ?xml version="1.0" encoding="GB2312"? >
< HTML xmlns:xsl="http://www.w3.org/TR/WD-xsl" >
< HEAD >
< TITLE >个人简历< /TITLE >
< /HEAD >< BODY >
< xsl:for-each select="resume" >
< P/ >
< TABLE border="1" cellspacing="0" >
< CAPTION style="font-size: 150%; font-weight: bold" >
个人简历
< /CAPTION >
< TR >
< TH >姓名< /TH >< TD >< xsl:value-of select="name"/ >< /TD >
< TH >性别< /TH >< TD >< xsl:value-of select="sex"/ >< /TD >
< TH >生日< /TH >< TD >< xsl:value-of select="birthday"/ >< /TD >
< /TR >
< TR >
< TH >技能< /TH >< TD colspan="5" >< xsl:value-of select="skill"/ >< /TD >
< /TR >
< /TABLE >
< /xsl:for-each >
< /BODY >
< /HTML >
完成这些以后再来让我们看一下辛勤劳动的成果，怎么样？效果不错吧。更酷还在后头呢。现在我们对文件（个人简历.xml）作进一步的修改：
1. 在标记< resume >前添加一个新标记< document >；
2. 将标记对< resume >< /resume >之间的内容（包括这一对标记）复制并粘贴在其后，并在最后用< document >结束。
3. 以 Notepad.exe 打开文件 resume.xsl，在标记< HTML >之后添加文字：< xsl:for-each select="document" >；在标记< /HTML >之前添加文字：< /xsl:for-each >，保存文件。
4. 在浏览器中打开文件（个人简历.xml）。看到了什么？两份个人简历！
就这样，利用 XML 我们可以编写内容与样式完成分离的文档！当然，XSL 文件比一般的 HTML 文件要复杂一些，然而一旦完成则可用于格式化所有同类的 XML 文档。
注：如果拷贝代码，请将空格删除