[XSLT] - menu recursief opbouwen

Pagina: 1
Acties:

  • Cavalera125
  • Registratie: December 2003
  • Laatst online: 15:49
Hoi,

ik wil een recursief menu opbouwen met XSLT. Ik heb de volgende xml structuur:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<ROOT>
  <.. rest van website ..>
  <MAINMENU>
    <MENU>
      <LABEL>menu 1</LABEL>
      <ITEM>
        <LABEL>item 1</LABEL>
        <URL>http://url1</URL>
      </ITEM>
      <ITEM>
        <LABEL>item asd</LABEL>
        <URL>http://url2</URL>
      </ITEM>
      <MENU>
        <LABEL>menu 1.1</LABEL>
        <ITEM>
          <LABEL>item asdsd</LABEL>
          <URL>http://urlasd</URL>
        </ITEM>
      </MENU>
    <MENU>
      <LABEL>menu 2</LABEL>
      <ITEM>
        <LABEL>item asdsd</LABEL>
        <URL>http://urlasd</URL>
      </ITEM>
    </MENU>
  </MAINMENU>
  <..meer van website..>
</ROOT>

Hoe kan ik nu ervoor zorgen dat ik dit geneste menu recursief op kan maken? Ik heb een aantal voorbeeldjes gezien van XSL en recursie waarbij er wat met tellertjes wordt gedaan, lijkt mij in dit geval niet toepasselijk.

Wat ik wil is dus bijvoorbeeld (in pseudo code):
code:
1
2
3
4
5
6
7
8
9
10
11
<for-each MENU>
  geef label weer
  <for-each ITEM>
    geeft item label weer
    geef url weer
  </for-each ITEM>
  kijk of er nog een menu is --> recursie
  <for-each MENU>
    doe ik dit met een call template? hoe geef ik dan de xml door?
  </for-each MENU>
</for-each MENU>

Ik hoop dat het een beetje duidelijk is zo.

  • Blue-eagle
  • Registratie: September 2000
  • Niet online
Plaats dit waar je het "menu" wilt hebben:
code:
1
<xsl:call-template name="writemenu"></xsl:call-template>

Doe dit in je XSL templates pagina om het menu te schrijven:
code:
1
2
3
4
5
6
7
8
9
10
11
12
    <xsl:template name="writemenu">
        <ul>
        <xsl:for-each select="item">
            <li>
                <xsl:value-of select="@name" />
                <xsl:if test="count(item) &gt; 0">
                    <xsl:call-template name="writemenu"></xsl:call-template>
                </xsl:if>
            </li>
        </xsl:for-each>
        </ul>
    </xsl:template>
En gebruik deze XML voor het menu:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
<menu>
    <item name=\"bla1\" />
    <item name=\"bla2\">
        <item name=\"bla3\" />
        <item name=\"bla4\">
            <item name=\"bla4.1\"></item>
            <item name=\"bla4.2\"></item>
        </item>
        <item name=\"bla5\" />
    </item>
    <item name=\"bla6\" />
</menu>


En je hebt een heel erg simpel "recursief" menu ;) Alleen nog een URL toevoegen, beetje stylen en je bent klaar.

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Je moet je XSL iets gaan aanpassen, waarbij je gebruikt maakt van:

XML:
1
<xsl:call-template name="dots">


Waarbij je dus je "hoofd functie" zo noemt

XML:
1
<xsl:template name="dots">


Heel simpel gevonden terwijl ik ging [google=XSLT recursion with menu]

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.