这节来谈谈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: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