Проблема сортировки группировок xsl - PullRequest
2 голосов
/ 15 декабря 2008

У меня есть следующий шаблон xsl, который я использую для группировки своего xsl. У меня проблема в том, что мне нужно прописать @Title в верхнем регистре, так как в настоящее время моя группа видит прописные и строчные буквы как отдельные группы.

  <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>

Я пытался использовать call-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, но без учета регистра - надеюсь, это имеет смысл!

Киран

1 Ответ

3 голосов
/ 24 декабря 2008

Чтобы преобразовать строчные буквы в верхние, используйте функцию XPath translate () .

Используя его, один из способов выразить желаемое преобразование заключается в следующем:

<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> инструкция .

...