### XSL 语法介绍

例子已经放在上面，下面我们可以来仔细的分析其中的语法结果和关键所在：
首先注意到的是，XSL 文件本身即是一份 XML 文件，所以在 XSL 文件的开头，一样有和 XML 文件相同的声明。W3C 这个 XML 的标准机构为 XSL 定义了很多标记（元素），XSL 文件就是这些标记和 HTML 标记的组合。在 XSL 文件中，必须有如下一行的代码：
＜xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"＞
这里，xsl:stylesheet 是 XSL 文件的根元素，在根元素中包含了所有的排版样式，样式表就是由这些排版样式组合成的；xmlns:xsl="http://www.w3.org/TR/WD-xsl"这一句主要用来说明该 XSL 样式表是使用 W3C 所制定的 XSL，设定值就是 XSL 规范所在的 URL 地址。
实际上，这里"http://www.w3.org/TR/WD-xsl"就是一个名字空间（namespace），我们在上面关于 XML Schema 语法介绍的时候已经进行过介绍。这是一个标准的名字空间。"stylesheet"，"template"，"for-each"等等关键字都是这个名字空间所定义的。
当然在 xsl:stylesheet 还可以设定其他的属性，其他的属性有：
1． default-space：决定是否保留 XML 文件中的空白，仅当值为"default"时保留。
2． indent-result：决定是否保留 XSL 文件中的空白，值为"yes"时保留。
3． language：设定在 XSL 文件中使用的脚本语言。
然后，我们在上面的代码中看到有如下的代码：
＜xsl:template match="/"＞
………
＜/xsl:template＞
这里实际上是表示了 XSL 解析器对 XML 文档的处理过程，它从根节点（由 match="/"决定，这里"/"就表示根节点）开始，对 XML 文档进行遍历，并根据具体的代码从 XML 文档中取出相关的内容。这里关于属性 match 的取值是一个比较复杂的问题。它实际上表示的含义是从 XML 文档中取出一个特定的节点集合（XML 文档可以被看成一个树的结构，这个在后面关于 XML 解析器分析中有详细的介绍）。这里，我们通过几个简单的例子来说明属性 match 的取值。
比如下面一行代码：
＜xsl:template match="/"＞
这行代码的意思是告诉 XSL 解析程序，当前需要处理的节点是根节点下的内容（用"/"来表示根节点），其实这里的 match 值内容的编写是要符合 XPath 的语意。关于 XPath 我们在后面的章节中会进行详细的介绍。
再举一个例子：
＜xsl:template match="shoppingcart/item"＞
这行代码要匹配的是 shoppingcart 元素下的 item 元素。而不管 shoppingcart 在 XML 文档结构树下的哪一个位置。比如 XML 文档的其中一段是这样的。
＜shoppingcart＞
＜item＞
＜itemNo＞3333＜/itemNo＞
＜itemName＞屠龙刀＜/itemName＞
＜/item＞
＜item＞
＜itemNo＞4444＜/itemNo＞
＜itemName＞离别钩＜/itemName＞
＜/item＞
＜/shoppingcart＞
那么它匹配的内容就是
＜item＞
＜itemNo＞3333＜/itemNo＞
＜itemName＞屠龙刀＜/itemName＞
＜/item＞
＜item＞
＜itemNo＞4444＜/itemNo＞
＜itemName＞离别钩＜/itemName＞
＜/item＞
而下面这个例子：
＜xsl:template match="/shoppingcart/item"＞
表示只匹配 XML 文档根节点下的 shoppingcart 这个节点下的所有 item 元素。也就是说如果 shoppingcart 不是直接在根节点下的，它就不符合这个匹配条件。
再看一个例子：
＜xsl:template match="price[@unit='USD']"＞
这个例子说明要匹配的是这样的节点：一个带 unit 属性的元素 price，而且 unit 的值必须为"USD"。比如一段 XML 代码是这样的。
＜price＞
＜unit＞USD＜/unit＞
＜amount＞100＜/amount＞
＜/price＞
＜price＞
＜unit＞RMB＜/unit＞
＜amount＞300＜/amount＞
＜/price＞
那么它匹配的内容就是：
＜price＞
＜unit＞USD＜/unit＞
＜amount＞100＜/amount＞
＜/price＞
实际上，存在许多各种符号用来表示匹配规则，我们在 XPath 语法介绍中会详细涉及到。现在知道这么一个大概的概念就可以了。
我们用＜xsl:template match="具体匹配表达式"＞这条语句找到了一些节点集合以后，我们就要从这个集合中找到特定的元素或者元素属性的值，那么采用什么语句呢？就是用 xsl:value-of select = ""这样的语句来寻找特定的内容。
比如下面的例子中＜xsl:value-of select="名称"/＞这行代码就是表示定位 XML 文档中的名称元素的内容。在指定集合中可能存在多个名字元素，如果我们需要把它们一一列举出来进行处理的话，就需要用到语句 xsl:for-each select = ""，注意这里涉及到一个作用范围的概念，也就是说 xsl:for-each select = ""这条语句是在一个指定的集合空间中执行的。比如上面例子中如下的代码
这里的＜xsl:for-each select="词语"＞是在＜xsl:template match="网络用语集合"＞所指定的集合空间里面寻找元素"词语"的。
同时，我们需要注意的是上面的代码中，出现了一条语句
＜xsl:apply-templates select="网络用语集合" /＞
它表示什么意思呢，它实际上相当于 C++中的一个过程调用，当 XSL 解析器执行到该语句的时候，它就会在代码中寻找以＜?xml:namespace prefix = xsl /＞＜xsl:template match="网络用语集合"＞开头的代码，所以在上面的例子程序中，以下的代码可以看成是过程的实现。
把看成是一个过程调用，把＜xsl:template match="网络用语集合"＞
…….
＜/xsl:template＞
看成是过程的实现，有助于我们对 XSL 解析器执行过程的理解。这里 match="网络用语集合"可以理解为是传递给过程的参数，它表示过程实现体的集合范围是该 match 所匹配的节点集合空间（"网络用语集合"）。
如果我们要对表格中的元素进行排序该什么办呢？比如说，在上面的例子中，我们需要按照名称进行排序。很简单对，改写为如下的形式即可：
＜xsl:for-each select="词语" order-by="+名称"＞，其中"+"表示按降序排列；"-"表示按升序排列。"order-by"是 XSL 语法中的关键字。
如果我们只想在列表中取出某几行该怎么操作呢？比如我们只想取出名称为"恐龙"的行，见下面的代码：
这里有一个新的句法为：＜xsl:template match="网络用语集合"＞
＜table Border="1"＞
＜xsl:for-each select="词语" order-by="-名称"＞
＜xsl:if test=".[名称='恐龙']"＞
＜tr＞
＜td＞＜xsl:value-of select="名称"/＞＜/td＞
＜td＞＜xsl:value-of select="含义"/＞＜/td＞
＜/xsl:if＞
＜/xsl:for-each＞
＜/table＞
＜/xsl:template＞
它表示如果".[名称='恐龙']"为真（TRUE）的话，就执行该段里面的语句，要是为假（FALSE）的话就不执行。它和 C++中的 if 语句的概念基本是一样的。
前面我们用＜xsl:value-of select=""/＞取出的都是一个元素的值，但是我们要取出元素某一个属性的值该怎么做呢？采用下面的形式：
＜xsl:value-of select="元素名称/@属性名称"/＞
比如一段 XML 代码是这样的：
＜王朔 网址="www.wangshuo.com"＞知名作家加著名评论家王朔先生的地方＜/王朔＞
我们可以用＜xsl:value-of select="王朔/@网址"/＞来得到值"www.wangshuo.com"。
以上包括了 XSL 的大多数基本的语法，更加详细和完整的介绍需要参看 W3C 相关的最新的文档，可以在 WWW.W3C.ORG/TR 下找到。
根据上面的分析，我们可以看到 XSL 实际上采用的是一种转换的思想，它最终将 XML 文档转换为另一种可用于输出的文档，而 CSS 则没有任何转换动作，在整个过程中没有任何新码产生。 另外，在 XSL 中 90%的样式规定在 CSS 中都有定义，但仍然有一些效果是 CSS 无法描述的，必须使用 XSL 不可。这些功能包括文本的置换、根据文本内容决定显示方式、文档内容排序等，都是 XSL 所独有的。再者，XSL 遵从 XML 的语法，而 CSS 的语法自成体系。
选择样式单还要考虑不同浏览器对样式单的支持程度。目前 IE5 与 Netscape 的最新版本都支持 CSS，但支持的程度都有限。至今为止，IE5 尚不能完全支持 CSS1，即便是支持的部分也存在很多错误，对于 CSS2 也只提供部分支持。Netscape 在对 CSS 的支持上已经优于 IE5，它采用新一代的 Raptor/Gecko 引擎技术，已经能够完全支持 CSS1，但对 CSS2 的支持计划尚不明朗。而对 XSLT 而言，只有 IE5 支持，Netscape5 并不支持。