Avatar billede Daniel.E Praktikant
21. marts 2005 - 11:52 Der er 10 kommentarer og
2 løsninger

træ menu hjælp meget vigtigt

hej

jeg er ved at lave en tree menu, men jeg fatter bare ikke XSLT ordenligt, og har ikke tiden til det. 

Jeg gider 200 points til den som kan skue noget sammen som gør hvad jeg beskriver.

Jeg skal bruge et XSL dokument som kan parse nedenstående XML til en tree menu. Hvor name er det som skal vises som text for brugeren.

<folders>

    <folder name="INBOX" >

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

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

        <folder name="OnkelBent"  />

    </folder>

</folders>

Det er meget vigtigt at denne HTML struktur er det som XSL spytter ud:

<dl id="tree">
    <dt>Tree Menu</dt>

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

    <dd><a href="#">Test</a></dd>
    <dd><a href="#">Test</a></dd>
   
    <dd class="pluslast">
        <dl>
            <dt><a href="#">Test5</a></dt>
            <dd><a href="#">Test5</a></dd>
            <dd class="last"><a href="#">Test5</a></dd>
        </dl>
    </dd>

</dl>
Avatar billede Slettet bruger
21. marts 2005 - 13:53 #1
Jeg synes ikke helt jeg kan gennemskue hvad du vil have i outputtet, men nedenstående skulle ihvertfald være brugbart som start (dvs.: fortæl mig hvad der mangler)

<?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">
            <dt>Folders</dt>
           
            <xsl:apply-templates />
       
        </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>
                <dd><xsl:apply-templates select="@name" /></dd>
                <xsl:apply-templates />
            </dl>
        </dd>
    </xsl:template>
   
    <xsl:template match="folder/@name">
        <a href="#"><xsl:value-of select="." /></a>
    </xsl:template>
 
</xsl:stylesheet>

/CS
Avatar billede Daniel.E Praktikant
21. marts 2005 - 15:21 #2
jeg kigger på det nu.. jeg er tæmlig grøn, så håber det er ok hvis jeg ikke lige svare tilbage i dag... men jeg skal prøve at gøre mit bedste.. :)
Avatar billede Daniel.E Praktikant
21. marts 2005 - 15:24 #3
Ok.. det var så meget hurtigt at jeg svarede tilbage :)

Folders
INBOX  <-- Denne skal være overordnet mappe
INBOX
Trash
Sent
Drafts
OnkelBent
TanteHanne  <-- Denne skal være overordnet mappe
TanteHanne
Sludder


Det eneste der er lidt forkert er hvad jeg har prøvet at fortælle med mine <-- :)

Når der står:

<a>
<b/>
</a>

Så skal det vises som

a
  b

og ikke

a
  a
  b
Avatar billede Daniel.E Praktikant
21. marts 2005 - 15:25 #4
Strukturen skla bare se sådan her ud.

Folders
INBOX
Trash
Sent
Drafts
OnkelBent
TanteHanne
Sludder
Avatar billede Slettet bruger
21. marts 2005 - 15:44 #5
Det tænkte jeg nok - og så skal du bare lige slette en linje i den template der matcher "folder[folder]" (dvs. <folder> elementer der indeholder <folder> elementer), så den ender med at se sådan ud:

<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:apply-templates />
            </dl>
        </dd>
    </xsl:template>

/CS
Avatar billede Daniel.E Praktikant
21. marts 2005 - 15:49 #6
hehe.. jeg havde faktisk selv fundet frem til det, ved den gode gamle metode, hvor man tager en linie af gangen, og forhåbenligt rammer man rigtigt engang. Og det gjorde jeg. :)
Avatar billede Daniel.E Praktikant
21. marts 2005 - 15:49 #7
Det er 100 % som der skal være lige nu.. du er min helt for i dag :)

Takker for hjælpen.. jeg skal huske dig når jeg skal have hjælp til XML/XSLT :)
Avatar billede Slettet bruger
21. marts 2005 - 15:51 #8
Du skal være velkommen :-)

/CS
Avatar billede atoft Nybegynder
22. marts 2005 - 11:14 #9
Ved godt det ikke giver point men jeg kan ikke dy mig :)

Hvorfor ikke smide templaten med match="folder[folder]" væk og ændre den anden til

xsl:template match="folder">
        <dd>
            <xsl:attribute name="class"><xsl:if test="folder">plus</xsl:if><xsl:if test="position() = last()">last</xsl:if></xsl:attribute>
            <dl>
                <dt><xsl:apply-templates select="@name" /></dt>
                <xsl:apply-templates />
            </dl>
        </dd>
    </xsl:template>
Avatar billede Slettet bruger
22. marts 2005 - 11:46 #10
Jeg forstår dig udmærket - det er "standard" programmering at gøre det sådan.

Men for mig handler det om at definere hvad der skal ske med de forskellige elementer i sourcefilen - altså: "sådan vil jeg gerne have at en folder der indeholder foldere ser ud" osv.

Det er også derfor at der er en template der matcher "folder/@name" - hvorfor ikke bare smide indoldet af den direkte ind i din foreslåede også? Fordi alle folder-elementers "name" attributter håndteres af denne, og derfor kan alle ændres i een template - ELLER: Man kan tilføje en mere specifik template senere, når man finder ud af at alle foldere der hedder noget med 'system' ikke skal linkes:

<xsl:template match="folder[contains(@name, 'system')]/@name">
<strong>SYSTEM FOLDER</strong>
</xsl:template>

/CS
Avatar billede atoft Nybegynder
22. marts 2005 - 12:37 #11
Jeg er ikke enig. Jeg ville til enhver tid gå efter den løsning som er den mest vedligeholdelsesvenlig og det mener jeg bestemt én "metode" frem for to må være.

Jeg ville overveje at splitte ud i flere templates hvis de adskiller sig væsentligt og det mener jeg ikke de gør her.

Just my 5 cents :)
Avatar billede Slettet bruger
22. marts 2005 - 12:50 #12
hehe - her bliver vi ikke enige :-)

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