xslt转换xml常用知识(4)

     这节来谈谈xslt对xml查询分组的问题。平时我们在写sql语句时,经常用到group by ,如果xslt里面也有这样的元素就好了。

不错,在xslt2.0里面确实有这样的元素了,那就是xsl:for-each-group元素。

看下例子:

Code

xsl:

Code

 

的确有了xsl:for-each-group这个元素,非常方便,不过这是xslt2.0里面的特性。而且非常致命的一点,

vs2008不支持xslt2.0(查看:http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2881720&SiteID=1),

因此只能用xslt1.0里面的方法了。那么如何做呢?请看下面的例子:

 

呈现效果可以在我的文章http://www.cnblogs.com/jackhuclan/archive/2008/08/23/1274058.html中找到,

 

xml和xslt样式文件下载:

https://files.cnblogs.com/jackhuclan/xmlxsl.rar

 

根据当时需求,需要根据DescriptionType分组,然后显示在页面右侧,并且左侧显示的右侧不再显示。这个时候考虑算法

根据DescriptionType分组,然后排除左侧已经显示过的DescriptionType,下载文件里面都有,这里只是对xslt1.0里面

分组强调一下。

<xsl:key name="des-search" match="JobDetail//Row" use="DesciptionType"/>

这一句是列出要分组的字段

 

<xsl:for-each select="JobDetail//Row[generate-id()=generate-id(key('des-search',DesciptionType)[1])]">
  
<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:for-each select="JobDetail//Row[generate-id()=generate-id(key('des-search',DesciptionType)[1])]">

 

更详细的文章请参考:http://www.oracle.com/technology/global/cn/pub/articles/wang_xslt.html 

 

 

 

 

posted @ 2008-09-04 12:28  落叶潇潇雨  阅读(382)  评论(0编辑  收藏  举报