接上次的文章xslt转换xml常用知识(1),介绍xslt转换xml的基本知识.(备注一下:文章中一些符号别编辑器给替换掉了,
这个----10;是为了不被编辑器给替换掉,故意这样写的,实践上应该是回车的实体符合,不清楚的可以看看我博客里面
一篇关于xml实体符号的文章)
1)xsl:template,xsl:variable,xsl:output,xsl:apply-templates,xsl:with-param,xsl:value-of,xsl:for-each,xsl:sort,
xsl:if,xsl:choose,xsl:when,xsl:call-template等元素的应用。
2)在xml中选择遍历,文本的回车转换成<br/>等
如有兴趣大家可以先参看我前面一篇文章:http://www.cnblogs.com/jackhuclan/archive/2008/08/23/1274058.html
(备注一下:文章中一些符号别编辑器给替换掉了,所有你想学习一下,还是参考我上一篇文章,下载一下代码。)
一)文本的回车转换成<br/>
< xsl:param name ="des" />
< xsl:choose >
< xsl:when test ="contains($des,' ')" >
< xsl:value-of select ="substring-before($des,'----10;')" />
< br />
< xsl:call-template name ="dds" >
< xsl:with-param name ="des" select ="substring-after($des,'----10;')" />
</ xsl:call-template >
</ xsl:when >
< xsl:otherwise >
< xsl:value-of select ="$des" />
</ xsl:otherwise >
</ xsl:choose >
</ xsl:template >
上面这段代码就相当于一个函数,<xsl:template name="dds">,dds相当于函数名称,<xsl:param name="des"/>,des参数名称
怎么调用的呢,和大家平时调用函数一样,在需要的地方,引入函数,设定参数。
< xsl:with-param name ="des" select ="Row/Description" ></ xsl:with-param >
</ xsl:call-template >
二)xml中的元素遍历。
现在需求这样的(参考我的上一篇文章)。在页面左下侧显示一个JobDetail/Row下面的内容,右侧在显示其他的Row下面的内容。
(需求是这样要求的,不然就直接排序,然后xsl:for-each就出来了,很简单。可要求将这样,就当挑战一下基本知识)
并且显示要根据Row/DesciptionType的分类。那么怎么做呢?我的算法如下:
1)保存第一行Row/DesciptionType中的值为全局变量
2)输出该具有相同DesciptionType的所有行,显示在左下侧
< xsl:with-param name ="des1" select ="$desciptionType" ></ xsl:with-param >
</ xsl:apply-templates >
< xsl:param name ="des1" ></ xsl:param >
< table width ="100%" border ="1" cellpadding ="0" cellspacing ="0" bordercolorlight ="#FFFFFF" bordercolordark ="#efefef" >
< tr >
< td height ="27px" style ="padding-left:8px" >
< h3 style ="color:#f9c011;padding-top:16px;" >
< xsl:value-of select ="Row[DesciptionType=$des1]/strDesciptionType" />
</ h3 >
</ td >
</ tr >
< xsl:for-each select ="Row[DesciptionType=$des1]" >
< tr >
< td height ="27px" style ="padding-left:15px" >
■ < xsl:value-of select ="ShortDescription" />
</ td >
</ tr >
</ xsl:for-each >
</ table >
< table border ="0" cellpadding ="0" cellspacing ="0" >
< tr >
< td height ="10" ></ td >
</ tr >
</ table >
</ xsl:template >
2)然后对JobDetail/Row排序,然后再进行循环遍历,如果该行已经显示过则跳过,如果没有显示过则将该行的DesciptionType
赋值给前面定义的全局变量,然后调用模板显示(相当于一个函数)
< xsl:sort select ="DesciptionType" data-type ="number" order ="ascending" />
< xsl:if test ="DesciptionType != $desciptionType" >
< xsl:variable name ="desciptionType" select ="DesciptionType" ></ xsl:variable >
< xsl:call-template name ="jd" >
< xsl:with-param name ="des1" select ="$desciptionType" ></ xsl:with-param >
< xsl:with-param name ="cnode" select ="//JobDetail/Row" ></ xsl:with-param >
</ xsl:call-template >
</ xsl:if >
</ xsl:for-each >
< xsl:param name ="des1" ></ xsl:param >
< xsl:param name ="cnode" ></ xsl:param >
< table width ="100%" border ="1" cellpadding ="0" cellspacing ="0" bordercolorlight ="#FFFFFF" bordercolordark ="#efefef" >
< tr >
< td height ="27px" style ="padding-left:8px" >
< h3 style ="color:#f9c011;padding-top:16px;" >
< xsl:value-of select ="$cnode[DesciptionType=$des1]/strDesciptionType" />
</ h3 >
</ td >
</ tr >
< xsl:for-each select ="$cnode[DesciptionType=$des1]" >
< tr >
< td height ="27px" style ="padding-left:15px" >
■ < xsl:value-of select ="ShortDescription" />
</ td >
</ tr >
</ xsl:for-each >
</ table >
< table border ="0" cellpadding ="0" cellspacing ="0" >
< tr >
< td height ="10" ></ td >
</ tr >
</ table >
</ xsl:template >
这里面涉及xsl:template,xsl:variable,xsl:output,xsl:apply-templates,xsl:with-param,xsl:value-of,xsl:for-each,xsl:sort,xsl:if,xsl:choose,xsl:when,xsl:call-template等元素的应用。这里简单说明一下,详解可以参考msdn
xsl:variable 定义全局变量
xsl:template 输出模板
xsl:apply-templates 应用模板,对某个节点应用什么模板,如:<xsl:apply-templates select="JobBase"></xsl:apply-templates>,注意select为节点名
xsl:call-template 调用模板,可以用函数的观念来理解就好理解了。和xsl:apply-templates还是有区别的,仔细看看我的文章将明白了
xsl:for-each,xsl:sort 前面是循环,后面是排序
xsl:if,xsl:choose,xsl:when 用于条件选择语句
xsl:output 定义xml的输出方式,有xml,html 如:<xsl:output method="xml" indent="yes"/>