2008-12-15 72 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> 指令表達。