2 Stimmen

xsl Gruppierung Sortierung Problem

Ich habe die folgende Xsl-Vorlage, die ich verwende, um meine Xsl zu gruppieren. Das Problem, das ich habe, ist, dass ich den @Title in Großbuchstaben schreiben muss, da meine Gruppierung derzeit Groß- und Kleinbuchstaben als getrennte Gruppen sieht.

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

Ich habe versucht, call-template zu verwenden und eine Variable zu setzen, aber xsl scheint dies nicht zu mögen:

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

Was ich versuche zu erreichen ist meunchian Gruppierung, aber ohne Groß-und Kleinschreibung - hoffe, das macht Sinn!

Kieran

3voto

Dimitre Novatchev Punkte 234995

Um Kleinbuchstaben in Großbuchstaben umzuwandeln, verwenden Sie den Befehl XPath translate()-Funktion .

Eine Möglichkeit, die gewünschte Transformation auszudrücken, ist die folgende:

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

Bei Anwendung auf das folgende XML-Dokument :

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

es führt zum gewünschten Ergebnis :

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

In XPath 2.0 wird man die upper-case () Funktion um Kleinbuchstaben in Großbuchstaben umzuwandeln.

Auch, Gruppierung in XSLT 2.0 kann besser ausgedrückt werden, indem die <xsl:for-each-group> Anleitung .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X