Frage

Ich habe folgende xsl Vorlage, die ich zu einer Gruppe bin mit meiner xsl. Das Problem, das ich habe ist, dass ich die @Title wie zur Zeit meine Gruppierung sieht Groß- und Klein als separate Gruppen in Großbuchstaben müssen.

  <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, rufen-Vorlage zu verwenden und eine Variable aber xsl scheint das 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, ist meunchian Gruppierung zu erreichen, aber ohne Groß- und Kleinschreibung - hoffen, dass dies macht Sinn

!

Kieran

War es hilfreich?

Lösung

Die Art und Weise Kleinbuchstaben in Groß zu konvertieren ist die XPath translate () Funktion .

Mit ihm eine Möglichkeit, die gewünschte Transformation ist die folgende auszudrücken:

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

Wenn auf dem folgenden XML-Dokument angewendet :

<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 erzeugt das gewünschte 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 nutzen die upper-case () Funktion Kleinbuchstaben in Großbuchstaben umgewandelt werden.

Auch in XSLT 2.0 Gruppierung kann besser sein, ausgedrückt mit dem <xsl:for-each-group>  Anweisung .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top