2008-12-15 75 views
2

我有我用来分组我的xsl的以下xsl模板。我遇到的问题是我需要大写@Title,因为目前我的分组将大小写为单独的组。xsl分组排序问题

<xsl:key name="rows-by-title" match="Row" use="substring(@Title,1,1)" /> 

    <xsl:template name="Meunchian" match="/dsQueryResponse/Rows"> 


      <xsl:for-each select="Row[count(. | key('rows-by-title', substring(@Title,1,1))[1]) = 1]"> 


       <xsl:sort select="substring(@Title,1,1)" /> 

       <p></p><xsl:value-of select="substring(@Title,1,1)" /><br /> 
        <xsl:for-each select="key('rows-by-title', substring(@Title,1,1))"> 
         <xsl:value-of select="@Title" /><br/> 
        </xsl:for-each> 

      </xsl:for-each> 

    </xsl:template> 

我试图用调用模板和设置变量,但XSL似乎并不喜欢这样的:

<xsl:key name="rows-by-title" match="Row" use="substring(@Title,1,1)" /> 

    <xsl:template name="Meunchian" match="/dsQueryResponse/Rows"> 



      <xsl:for-each select="Row[count(. | key('rows-by-title', substring(@Title,1,1))[1]) = 1]"> 

    <xsl:variable name="myTitle"> 

      <xsl:call-template name="to-upper"> 
      <xsl:with-param name="text"> 
       <xsl:value-of select="@Title"/> 
      </xsl:with-param> 
      </xsl:call-template> 

    </xsl:variable> 

   <p></p><xsl:value-of select="$myTitle" /><br /> 
        <xsl:for-each select="key('rows-by-title', substring(@Title,1,1))"> 
         <xsl:value-of select="@Title" /><br/> 
        </xsl:for-each> 

      </xsl:for-each> 

    </xsl:template> 

我所试图实现的是meunchian分组但没有区分大小写 - 希望这可以让Sense!

基兰

回答

3

以小写字母转换为大写的方式是使用XPath translate() function

使用它,以表达所需转化的一种方式如下:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml"/> 

<xsl:variable name="vLower" select= 
    "'abcdefghijklmnopqrstuvwxyz'" 
    /> 

<xsl:variable name="vUpper" select= 
    "'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" 
    /> 

<xsl:key name="rows-by-title" match="Row" use= 
"translate(substring(@Title,1,1), 
      'abcdefghijklmnopqrstuvwxyz', 
      'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 
      )" /> 

    <xsl:template match="/"> 
    <html> 
     <xsl:apply-templates select="*/*"/> 
    </html> 
    </xsl:template> 

    <xsl:template name="Meunchian" match="/dsQueryResponse/Rows"> 
     <xsl:for-each select= 
      "Row[generate-id() 
       = 
       generate-id(key('rows-by-title', 
           translate(substring(@Title,1,1), 
              $vLower, 
              $vUpper) 
           )[1] 
         ) 
       ]"> 
      <xsl:sort select="translate(substring(@Title,1,1), 
               $vLower, 
               $vUpper)" /> 
      <p></p> 
      <xsl:value-of select="translate(substring(@Title,1,1), 
                $vLower, 
                $vUpper)" /> 
      <br /> 
      <xsl:for-each select= 
          "key('rows-by-title', 
            translate(substring(@Title,1,1), 
            $vLower, 
            $vUpper)"> 

       <xsl:value-of select="@Title" /> 
       <br/> 
      </xsl:for-each> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

当在下面的XML文档施加:

<dsQueryResponse> 
    <Rows> 
     <Row Title="Agenda" /> 
     <Row Title="Policy" /> 
     <Row Title="policy" /> 
     <Row Title="Report" /> 
     <Row Title="report" /> 
     <Row Title="Test2" /> 
     <Row Title="test1" /> 
     <Row Title="Boo" /> 
     <Row Title="foo" /> 
    </Rows> 
</dsQueryResponse> 

它产生所期望的结果

<html> 
    <p/>A 
    <br/>Agenda 
    <br/> 
    <p/>B 
    <br/>Boo 
    <br/> 
    <p/>F 
    <br/>foo 
    <br/> 
    <p/>P 
    <br/>Policy 
    <br/>policy 
    <br/> 
    <p/>R 
    <br/>Report 
    <br/>report 
    <br/> 
    <p/>T 
    <br/>Test2 
    <br/>test1 
    <br/> 
</html> 

在XPath 2.0中,将使用upper-case()函数将小写字母转换为大写字母。

此外,在XSLT 2.0分组可以更好地使用<xsl:for-each-group> 指令表达。