Avatar billede Daniel.E Praktikant
23. marts 2005 - 09:58 Der er 9 kommentarer og
2 løsninger

xslt omkodning af sturktur til træ menu

hej

jeg har dette XSL dokument:

<?xml version="1.0" encoding="iso-8859-1" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />

    <xsl:template match="/">
        <html>
        <head>
            <title>Folders</title>

        </head>
        <body>
     
        <xsl:apply-templates />
     
        </body>
        </html>
    </xsl:template>

    <xsl:template match="folders">
        <dl id="tree">
            <dd class="pluslast">
              <dl>
                <dt><a>Folders</a></dt>
                  <xsl:apply-templates />
              </dl>
            </dd>
        </dl>
    </xsl:template>
 
    <xsl:template match="folder">
        <dd>
            <xsl:if test="position() = last()">
                <xsl:attribute name="class">last</xsl:attribute>
            </xsl:if>
            <xsl:apply-templates select="@name" />
        </dd>
    </xsl:template>
 
    <xsl:template match="folder[folder]">
        <dd>
            <xsl:attribute name="class">plus<xsl:if test="position() = last()">last</xsl:if></xsl:attribute>
            <dl>

                <dt><xsl:apply-templates select="@name" /></dt>

            </dl>
        </dd>
        <xsl:apply-templates />
    </xsl:template>
 
    <xsl:template match="folder/@name">

        <a href="#"><xsl:value-of select="." /></a>

    </xsl:template>

</xsl:stylesheet>

Jeg er ved at lave en træ menu.  Men problemet er ikke en fejl, det handler om at flytte rundt på nogle ting.  Jeg har siddet med det i 10 timer sammenlagt, og nu fik jeg bare nok. heh

XSL dokumentet skal spytte en struktur ud som er denne:

+ Folders
    INBOX
    Trash
    Sent
    Drafts
    OnkelBent
  + TanteHanne
      Sludder



XML dokumentet ser sådanne ud:

<folders>

        <folder name="INBOX" >

        <folder name="Trash" />
        <folder name="Sent"  />
        <folder name="Drafts" />

          <folder name="OnkelBent" />

        <folder name="TanteHanne" >
            <folder name="Sludder" />
        </folder>

        </folder>

</folders>


Det umiddelbare som mange sikkert bil spotte med det samme er at den yderste mappe name="INBOX" er forældre til alle de andre.  Men det skal ikke vises sådan.

Det er vigtigt at denne HTML struktur og tag inkapsulering overholdes.

<dl id="tree">
    <dt>Tree Menu</dt>
    <dd class="plus">
        <dl>
            <dt><a href="#">Test1</a></dt>
            <dd><a href="#">Test1</a></dd>
            <dd class="last"><a href="#">Test1</a></dd>
        </dl>
    </dd>
    <dd class="plus">
        <dl>
            <dt><a href="#">Test2</a></dt>
            <dd><a href="#">Test2</a></dd>
            <dd class="plus">
                <dl>
                    <dt><a href="#">Test3</a></dt>
                    <dd><a href="#">Test3</a></dd>
                    <dd class="last"><a href="#">Test3</a></dd>
                </dl>
            </dd>

            <dd class="pluslast">
                <dl>
                    <dt><a href="#">Test4</a></dt>
                    <dd><a href="#">Test4</a></dd>
                    <dd class="last"><a href="#">Test4</a></dd>
                </dl>
            </dd>
       
        </dl>
    </dd>
</dl>
Avatar billede Daniel.E Praktikant
23. marts 2005 - 09:59 #1
Sådan ser outputtet ud nu...


+INBOX
  Trash
  Sent
  Drafts
  OnkelBent
  +TanteHanne
    Sludder
Avatar billede atoft Nybegynder
23. marts 2005 - 10:03 #2
Hvorfor ikke bare lave xml'en om så inbox ikke er forældre til de øvrige noder?
Avatar billede Daniel.E Praktikant
23. marts 2005 - 10:05 #3
Hej atoft. :)

Det er ikke en mulighed jeg har.  Tro mig.. det ville jeg også gøre hvis det stod til mig selv.. Men det gør det ikke :(
Avatar billede atoft Nybegynder
23. marts 2005 - 10:17 #4
prøv at rette din template til

  <xsl:template match="folder[folder]">
        <dd>
            <xsl:attribute name="class">plus<xsl:if test="position() = last()">last</xsl:if></xsl:attribute>
            <dl>

                <dt><xsl:apply-templates select="@name" /></dt>
                <xsl:if test="not(name='INBOX')><xsl:apply-templates /></xsl:if>
            </dl>
        </dd>
        <xsl:if test="name='INBOX'><xsl:apply-templates /></xsl:if>
    </xsl:template>
Avatar billede atoft Nybegynder
23. marts 2005 - 11:05 #5
ja det mangler 2 " men dem må du selv sætte ind.
Avatar billede Slettet bruger
23. marts 2005 - 13:12 #6
Jeg vil foreslå dig at gøre flg. i din "folders" template:

<xsl:call-template name="output-INBOX" />
<xsl:apply-templates select="folder[@name = 'INBOX']/folder" />

(Istedet for den enlige "apply-templates")

- OG tilføje en "Named template" :

<xsl:template name="output-INBOX">
    <dd>
        <a href="#">INBOX</a>
    </dd>
</xsl:template>

/CS
Avatar billede Daniel.E Praktikant
23. marts 2005 - 13:16 #7
hey :)

Jeg har faktisk selv fundet en metode til at ændre problemet på.

<xsl:when test="contains(@name,'INBOX')">
                <dd style="text-transform: capitalize;"><xsl:apply-templates select="@name" /></dd>
                                <xsl:apply-templates />
            </xsl:when>
            <xsl:otherwise>
                <dd>
                    <xsl:attribute name="class">plus<xsl:if test="position() = last()">last</xsl:if></xsl:attribute>
                    <dl>
                                                <dt><xsl:apply-templates select="@name" /></dt>
                        <xsl:apply-templates />
                    </dl>
                </dd>
            </xsl:otherwise>       


Lige for at overholde ekspertens regler om at vise løsningen.

Men i skal da have nogle points adligeveller..  :)

Jeg må indrømme at jeg ikke har testet Jeres svar endnu.. men jeg stoler på det... i får halvdelen hver.  Så tror jeg ikke at der er nogle som føler sig snydt.
Avatar billede Slettet bruger
23. marts 2005 - 13:20 #8
Hmm - just in case:

Hvis du også vil bytte rundt på "OnkelBent" og "TanteHanne" (og hvis det er fordi du vil have under-underfolderne tilsidst):

<xsl:call-template name="output-INBOX" />
<xsl:apply-templates select="folder[@name = 'INBOX']/folder[not(folder)]" />
<xsl:apply-templates select="folder[@name = 'INBOX']/folder[folder]" />

/CS
Avatar billede atoft Nybegynder
23. marts 2005 - 13:27 #9
For at samle tråden op fra sidst CS :-)

Du kan godt se at det kun er foldere under inbox som kommer til sidst i din model. Hvade man i stedet lavet en tempalte som jeg mente var den rigtige løsning, ville man kunne få alle med under foldere til sidst på alle niveauer.

Kunne ikke lade vær ;)
Avatar billede Slettet bruger
23. marts 2005 - 13:43 #10
Hej atoft.

Jeg har ingen problemer med at samle tråde op - og slet ikke når det er interessante diskussioner ;-)

Jeg kan sagtens se at det kun er foldere under INBOX - det lå ligesom i luften (dvs. spørgsmålet og XML filen) - men grunden til at jeg vælger denne løsning er at han (vb2) nu er godt igang med at omstrukturere sourcefilen - derfor synes jeg helt klart at det skal være synligt i stylesheet'et (og mere synligt end en "choose" eller "if").

Hvis der senere kommer flere "folder" elementer i sourcefilen, er det jo en smal sag at følge fidusen, da de jo (højst sandsynligt) også skal omstruktureres.

/CS
Avatar billede Daniel.E Praktikant
23. marts 2005 - 13:58 #11
ok.. så ved je hvor jeg skal kigge ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester