版权声明: 本文由 一只博客 发表于 bloghome博客html
XSLT 是一种用于将 XML 文档转换为 XHTML 文档或其余 XML 文档的语言。这种转换一般由专用的软件或者浏览器执行。目前,绝大多数主流的浏览器支持XSLT转换。XSLT本质上也是一个XML文档,所以它的编写也是要遵循XML的基本规范。XSLT中有不少元素,此处总结一下<xsl:apply-templates>的使用方法。app
假设有以下一个XML文档。ide
其中加粗的部分,是为了可以使得浏览器可以转换该XML文档而引入指令语句,表示引入一个example.xslt文件函数
那么任务的重点其实是编辑符合规范的example.xsl文件。咱们一步一步完善这个XSLT文件。首先加入 <xsl:template match="/">spa
节点,以下:3d
该节点中,match="/"表示匹配需转换的xml文件中的根结点,这是一个XPath的路径表达式,(XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历,若是须要了解更多关于XPath的信息,能够参考http://www.w3school.com.cn/xpath/index.asp)。所以 <xsl:template match="/"> </xsl:template> 也就表示了把须要转换的XML文档的根结点内的内容换成 <xsl:template match="/"> </xsl:template> 中的内容。即转换后变成了:orm
<html>xml
<body>htm
<h2>职员列表清单</h2>
</body>
</html>
所以在IE中显示的内容以下:
接下来可使用<xsl:apply-templates>,<xsl:apply-templates>相似一个函数,对 <xsl:template match="/"> 中的每个元素作一次转换。 <xsl:apply-templates> 老是包含在 <xsl:template >中的。
若是在XSLT中加了<xsl:apply-templates>,即以下:
那么,默认的显示了当前template中的根元素的值,由于当前template中的match是"/",对应的内容是XML文档中的<company>节点的内容,所以把company节点下的元素值都显示了,以下:
这类直接获取了company节点下的值,而且也没指定要如何转换,所以等价于下面的写法:
若是只要获取staff的值,那么在select的时候,指定staff节点既能够了。
或者,也能够同时修改template的match值:
显示的内容都是同样的,以下图:
事实上,上例中,咱们定义了模板,改模板只要求匹配"/"即根结点元素,对于根结点内的子元素,如何转换并没有响应的模板来指明,所以下一步,在定义一个新的模板,来指明如何对staff元素实行转换:
此处添加了一个新的模板,这个模板只对staff元素生效。所以,在上面<xsl:apply-templates select="company/staff"/>应用这个模板时,检测到下面有对应的模板,就会根据该模板来转换当前的元素。所以显示效果以下:
<html>
<body>
<h2>职员列表清单</h2>
<b>姓名:张三</b>: 性别:male年龄:30
<b>姓名:李四</b>: 性别:female年龄:22
</body>
</html>
更完善的,咱们能够再添加一个模板,显示老板的信息,以下:
转换结果以下:
至此, <xsl:apply-templates />的使用方法也有大体的解了,总结一下:
<xsl:apply-templates/>老是包含在<xsl:template />中,当转换软件遇到这个语句时,就会对 <xsl:apply-templates/>所匹配的元素进行转换(所匹配的元素由select属性设置,该值是一个XPath中的路径表达式,而且和<xsl:template />中的match相关)。
<xsl:apply-templates/>在对元素应用模板的时候,会去文档中查看是否存在一个对应的模板(即该模板定义了如何转换 <xsl:apply-templates/>匹配的元素)。所谓处理转换,实际上就是把XML文档中的值,代入模板,并输出代入后的模板内容,相似变量赋值。
网上看到一篇文章http://www.cnblogs.com/it_mac/archive/2010/06/27/1766151.html,做者列出了他的错误。实际上,错误是因为第18行<xsl:apply-templates/>,该语句的执行,是在<xsl:template match="cd">下,即在对cd下的元素作转换的时候。cd下有3个子元素title,artist和tracks,这3个子元素都会作转换,只不过因为并未找到和title,artist元素相对应的模板,所以把他们按文本的形式输出了,因此转换的结果就如做者写的那样。
这里只须要作一个小改动,把语句改为<xsl:apply-templates select="tracks"/>便可,这表示,对cd下的元素,只选择tracks元素作转换,就解决问题了。