当使用<xsl:template>元素时,通常要使用match属性,来指明该模板规则是同哪个元素相匹配的,要应用于哪个元素。match属性支持一套复杂的语法,来精确的定位哪些元素是匹配的,哪些是不匹配的。另外,用于xsl:apply-templates,xsl:value-of,xsl:for-each,xsl:copy-of以及xsl:sort等元素中的select属性,也是用来定位匹配元素的,它支持比match属性更复杂、强大的语法功能集来精确定位元素。下面就分几个部分,来详细的讲述一下如何实现匹配特定的节点。
根节点的匹配:
当用xsl样式表对xml文档进行转换时,转换的结果是一个well-formed的xml文档,因此,xsl转换所做的第一项工作就是生成结果文档的根元素。通常,xsl样式表都是从匹配根节点的规则开始,来生成结果文档的根元素。为了表示一条规则是同根节点相匹配的,可以给match属性赋值"/"。例如:
<xsl:template match="/"> <result_tree_root> <xsl:apply-templates /> </result_tree_root></xsl:template>
这条规则仅仅匹配xml文档的根节点。当xml文档的根节点被xsl处理器读入时,就输出标记<result_tree_root>,然后去处理根节点的子元素,最后输出</result_tree_root>节点。
一般的xsl处理器都有一个缺省的同根节点相匹配的规则,因此在平时所见到的xsl实例中可能没有根规则。而上面这个小例子,则覆盖了根节点的缺省规则,使用了自定义的根规则。
下面用一个只有一个根规则的,完整的样式表的例子,来加深一下对上述描述的认识。
对于一个xml文档,如果施以下面的样式表:
<?xml version="1.0" encoding="gb2312" ?><xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/"> <html> <head> <title>An XSL style sheet with one rule for the root node</title> </head> <body> Hello everyone! This is a rule for the root node of the input document. </body> </html></xsl:template>
因为在这个样式表中,只提供了应用于根节点的规则,而且在这条规则中没有指明如何进一步的去处理根节点的子节点。所以,在转换后的输出结果中,只有这条规则中的内容。换句话说,这个样式表无论施加在哪个xml文档上,都会得到下面的输出结果:
<html> <head> <title> An XSL style sheet with one rule for the root node</title> </head> <body> Hello everyone! This is a rule for the root node of the input document. </body></html>
你可以自己写一个well-formed的xml文档,然后应用上面的样式表,看看会得到什么转换效果。 然后再把这个样式表施加到其它的xml文档中试试呢?
元素匹配:
在xsl样式表中,最基本的模式匹配就是元素匹配。在元素匹配中,match属性的值是一个元素名,所有叫那个名字的元素都将被匹配。例如,下面的模板匹配所有的book元素,并且用黑体来显示它的子元素author:
<xsl:template match="book"> <b><xsl:value-of select="author"/></b></xsl:template>
为了能更详细的解释说明如何实现"元素匹配",我们来看一个具体的例子。在这个例子中,我们用样式表book.xsl来对xml文档book.xml进行转换。
对于下面的book.xml文档:
<?xml version="1.0" encoding="gb2312" ?><?xml:stylesheet type="text/xsl" href="book.xsl" ?><books> <book> <title>ASP2.0揭密</title> <author>Stephen Walther</author> </book>
<book> <title>LINUX大全</title> <author>Jack Tachett Jr. And David Gunter</author> </book></books>
给定的样式表book.xsl如下:
<?xml version="1.0" encoding="gb2312"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/"> <html> <head> <title>书目列表</title> </head> <body> <xsl:apply-templates select="books"/> </body> </html></xsl:template>
<xsl:template match="books"> <h1 align="center">书目列表</h1> <table border="1" align="center"> <th>书名</th> <th>作者</th> <xsl:apply-templates select="book" /> </table></xsl:template>
<xsl:template match="book"> <tr> <td aligh="center"><xsl:value-of select="title" /></td> <td aligh="center"><xsl:value-of select="author" /></td> </tr></xsl:template>
</xsl:stylesheet>
在这个样式表中,首先通过match="/"来匹配根节点。在根节点的模板规则中,包含了一个xsl:apply-templates元素,xsl:apply-templates利用select属性来保证根节点的子节点books元素将被进一步处理。
然后,通过match="books"创建了一个应用于books元素的规则。这条规则首先生成了一个表格的头部信息,然后又通过xsl:apply-templates指出,需要对book元素再做进一步的处理来生成表格的内容。
最后,通过match="books"创建了book规则。在book规则中,通过<xsl:value-of select="title" />和<xsl:value-of select="author" />来获取book元素中的子元素title和author的实际内容,并把这些内容封装在html的<tr>、<td>元素中,因此,最终得到的结果就是一个显示书目信息的表格。
用 / 来匹配子节点:
xsl 如何匹配特定的节点
原创文章如转载,请注明:转载自悠悠博客 [ http://www.ajaxstu.com/ ]
相关文章:
- asp读取xml Utf-8和Gb2312乱码问题(2007-11-13 4:31:37)
- XML 属性(2007-10-27 6:23:46)
- XML 检视(2007-10-15 9:36:52)
- 将HTML表单数据存储为XML格式(2007-10-3 7:58:39)
- XML Schema教程(2007-9-9 10:38:22)
- 微软的XML解析器(2007-9-8 7:37:48)
- 认识XML中的XPath(2007-7-23 1:15:34)
- XSL学习心得 - 制作图像超链(2007-6-12 4:36:41)
- ASP读取XML(2007-4-15 5:5:31)
- TrackBack 技术规范(2007-3-27 10:39:18)
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
