xsl:output 元素是可选的它的method属性用于指定输出文档的格式可以设置为xmlhtml或text值此处使用xml输出样式说明输出的文档是XML格式的XSLT转换会尽量生成XML文档但不作保证因此仍然有可能生成不合格的XML文档
xsl:template 用于定义一个XSLT模板模板类似编程语言中的函数可实现XSLT代码的重用模板可以使用name属性定义名称也可以使用match属性定义匹配的XPath路径这个模板使用了match属性来匹配XML文档本身
然后是 html 元素由于html元素没有使用xsl的前缀因此不属于xslt代码因此将原样输出跟着后面的bodytable元素也是一样的
xsl:foreach 元素类似C#中的foreach 语法结果表示循环遍历元素它使用select属性指定一个XPath相对路径XSLT使用这个相对路径查询所有要遍历的XML节点此时当前节点就是XML文档本身因此XSLT处理器会调用XmlDocument的SelectNodes 函数来获得要遍历的XML节点函数的参数就是Table/Record于是我们开始循环遍历所有的Record元素了
在循环遍历Record元素时对每一个Record元素都要输出xsl:foreach的子节点首先是 tr 元素这不是XSLT元素因此原样输出这里还套嵌定义了另外一个foreach元素于是我们又开始了一个新的循环遍历了新的循环指定的相对XPath路径是一个星号表示匹配所有名称的子元素这类似DOS命令Dir中使用星号匹配所有文件此处表示循环遍历Record元素下面所有的字段元素
对每一个字段元素首先输出td 元素然后处理xsl:valueof 元素xsl:valueof 表示输出指定相对路径的节点的值这里指定的XPath是一个点号表示当前节点本身由于当前节点是XML元素因此也就输出元素的文本内容相当于输出XmlElement的InnerText 属性值
为了让大家更清楚的了解XSLT执行过程我写了一段C#代码来模拟实现这个XSLT转换过程代码在演示程序的 codexsltaspx 中代码如下
// 此处代码动态构造 xml 文档对象结构来输出XML文档
SystemXmlXmlDocument XmlDoc = new SystemXmlXmlDocument();
查询数据库填充XmlDoc
// 保存输出结果的缓沖区
SystemIOStringWriter myResult = new SystemIOStringWriter();
myResultWriteLine(<html>);
myResultWriteLine( <body>);
myResultWriteLine( <table border=>);
// 模拟 <xsl:foreach select=Table/Record>
foreach( SystemXmlXmlNode node in XmlDocSelectNodes(Table/Record))
{
myResultWriteLine( <tr>);
// 模拟 <xsl:foreach select=*>
foreach( SystemXmlXmlNode node in nodeSelectNodes(*))
{
myResultWrite( <td>);
// 模拟 <xsl:valueof select= />
myResultWrite( nodeInnerText );
myResultWriteLine(</td>);
}
myResultWriteLine( </tr>);
}
myResultWriteLine( </table>);
myResultWriteLine( </body>);
myResultWriteLine(</html>);
myResultClose();
代码很简单这里我就不详细说明了
这里只是展示了一个非常简单的XSLT转换过程XSLT和XPath语法不少但花点时间是可以记下来的编写XSLT模板是很有技巧性的一般的我们要设计XSLT模板首先获得要转换的XML文档样本以及所需转换结果的样本这两个样本可能相差非常大所有的差别都需要依靠XSLT转换模板来弥补此时XSLT模板的编写不只是XSLT元素和函数的堆砌而是需要同时兼顾输入和输出还需要使用面向过程的编程思想有时还需要编程对XSLT转换器进行扩展
XML/XSLT在WEB开发中的应用
XML/XSLT技术在WEB开发中可以发挥很大的应用可以为WEB开发提供一种新的HTML页面生成方式
一般的在WEB开发中使用XML/XSLT技术主要有两种模式一个是在服务器端执行XSLT转换另一个是在客户端执行XSLT转换