Toon posts:

[xsl/wml] outputten van tree-structuur

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een menu-definitie in xml en twee stylesheets om dat om te zetten naar een boom-structuur; 1 voor (x)html en 1 voor wml

omzetten naar html is eenvoudig; Gewoon gebruik maken van het <ul> en <li> html element.

Helaas wordt dat in wml niet ondersteunt en zal ik met white-spaces moeten werken. Kom er alleen niet uit om dit voor mekaar te krijgen, zodat een menu met onbeperkte diepte netjes in een boom-structuur wordt uitgeprint.

een menu-definitie ziet er zo uit:
code:
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="ISO-8859-1"?>
<menus label="Drinks">
  <menu label="Drinks">
    <menuItem type="link" url="" title="" label="Add a mix"/>
    <menuItem type="text" title="" label="View drinks" expanded="true">
    <menuItem type="link" url="" title="" label="Per category"/>
    <menuItem type="link" url="" title="" label="View all drinks"/>
    </menuItem>
    <menuItem type="link" url="" title="" label="Search a drink"/>
  </menu>
</menus>

en m'n menu.html.xsl stylesheet zo:
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            
  <xsl:import href="templates.xsl"/>
  <xsl:param name="theme">default</xsl:param>
  <xsl:param name="lang">en-us</xsl:param>
  
  <xsl:output method="html" 
              encoding="utf-8"
              omit-xml-declaration="yes"
              media-type = "text/html"
          version="1.0"
          doctype-system="http://www.w3.org/TR/html4/strict.dtd" 
          doctype-public="-//W3C//DTD HTML 4.01//EN"
          indent="yes"/>
          
  <xsl:template match="menus">
    <html>
    <head>
      <title><xsl:value-of select="@label"/></title>
      <xsl:element name="link">
        <xsl:attribute name="rel">stylesheet</xsl:attribute>
        <xsl:attribute name="href"><xsl:value-of select="concat('css/', $theme, '.css')"/></xsl:attribute>
        <xsl:attribute name="type">text/css</xsl:attribute>
      </xsl:element>
    </head> 
    <body class="menu">
      <xsl:call-template name="header"/>
      <xsl:apply-templates select="menu"/>
      <xsl:call-template name="footer"/>
    </body>
    </html>
  </xsl:template>
  
  <xsl:template match="menu">
    <br/><p align="center" class="heading"><xsl:value-of select="@label"/></p>
    <table class="menu">
    <tr class="menu">
      <td class="menu">
        <ul class="menu"><xsl:apply-templates select="menuItem"/></ul>
      </td>
    </tr>
    </table>
  </xsl:template>
  
  <xsl:template match="menuItem[not(menuItem)]">
    <xsl:element name="li">
    <xsl:attribute name="class">menu</xsl:attribute>
    <xsl:apply-templates select="current()" mode="specific"/>
    </xsl:element>
  </xsl:template>
  
  <xsl:template match="menuItem[menuItem]">
    <xsl:element name="li">
    <xsl:attribute name="class">menu</xsl:attribute>
    <xsl:apply-templates select="current()" mode="specific"/>
    <ul><xsl:apply-templates select="menuItem"/></ul>
    </xsl:element>
  </xsl:template>
  
  <xsl:template match="menuItem[@type='link']" mode="specific">
    <xsl:element name="a">
    <xsl:attribute name="href"><xsl:value-of select="@url"/></xsl:attribute>
    <xsl:call-template name="standardAttributes"/>
    <xsl:value-of select="@label"/>
    </xsl:element>
  </xsl:template>
  
  <xsl:template match="menuItem[@type='text']" mode="specific">
    <xsl:element name="a">
    <xsl:attribute name="class">output</xsl:attribute>
    <xsl:call-template name="standardAttributes"/>
    <xsl:value-of select="@label"/>
    </xsl:element>
  </xsl:template>
  
  <xsl:template name="standardAttributes">
    <xsl:attribute name="title"><xsl:value-of select="@title"/></xsl:attribute>
    <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
    <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
  </xsl:template>
  
</xsl:stylesheet>

iemand die hier een lichtje op kan schijnen?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Hum, lastig: het invoegen van die white-space is niet bepaald triviaal (daar was je zelf ook al achter ;) ). Het probleem is dat for-each slechts per niveau werkt en je dus niet op elke regel een aantal spaties neer kunt zetten.

Wat je wel kunt doen: kijk in een menuitem hoeveel menu's er boven zitten. Dit kan je wel uitdrukken in een XPath expressie. Voor elk menu zet je whitespace neer. Kijk desnoods eens in de XPath tutorial op http://www.zvon.org voor hints. Daar staan namelijk een paar voorbeelden die hier wel op lijken. :)

Als je er niet uitkomt kan uiteraard nog wel ff een hint geven... :)

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

anders kijk even op
http://www.geocities.com/peter_veentjer
en dan personal project xsl/xml menu

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

op www.jars.com onder dhtml staan ook een aantal menu genereer tools.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

en een tip: layers die inspringen..

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Alarmnummer had wat tips
HTML werkt al, WML is het probleem ;) . Of zie ik het verkeerd en biedt dit een oplossing voor WML?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

wat is WML?
Wireless Markup Language?
Website Meta Language?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Alarmnummer: wat is WML? Wireless Markup Language?
Wat zitten al die acroniemen toch logisch in elkaar he? :+ .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Alarmnummer (the editor) poste nog even een gok: Website Meta Language?
Had je het nu maar bij je eerst gok gelaten ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Sorry :) liep weer in mijn berichtjes te editen :)
heb je dat laatste stuk van mijn verhaal nog meegekregen?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Jammer dat je al die acroniemen niet mag gebruiken bij scrabble :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Alarmnummer: heb je dat laatste stuk van mijn verhaal nog meegekregen?
* mbravenboer zoekt een verhaal .

* mbravenboer denkt dat Alarmnummer doelt op niet-monotoon redeneren
* mbravenboer heeft dat inderdaad goed gelezen, maar weet er niet genoeg van om er concreet op in te gaan.
* mbravenboer vond het wel informatief :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Heren, ik zie 2 mensen die hun postcount omhoog willen halen, we hebben ook nog een editknop hoor ;)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Nielsz: we hebben ook nog een editknop hoor ;)
Die weet Alarmnummer heel goed te vinden >:) , maak je maar niet ongerust ;) .

* mbravenboer denkt wel dat we nu weer on-topic moeten .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik bedoelde inderdaad het niet monotone verhaal :)
en de edit knop die heb ik inderdaad al gevonden *D

Verwijderd

Topicstarter
Op vrijdag 18 januari 2002 16:15 schreef mbravenboer het volgende:Als je er niet uitkomt kan uiteraard nog wel ff een hint geven... :)
Graag :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
At your service ;) .

In deze stylesheet gebruik ik de ancestor axis. Je kunt de werking hiervan prachtig zijn in de XPath Tutorial op http://www.zvon.org. Kijk daar eens goed naar, in deze gevallen kunnen ze erg makkelijk zijn...

Met deze input:
code:
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0"?>

<menu-bar>
    <menu label="Drinks">
      <menu-item label="Add a mix"/>
      <menu label="View drinks">
        <menu-item label="Per category"/>
        <menu-item label="View all drinks"/>
      </menu>
      <menu-item label="Search a drink"/>
    </menu>
</menu-bar>

en deze stylesheet:
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
31
32
<?xml version="1.0"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
    <xsl:output method="text" encoding="utf-8"/>
          
    <xsl:template match="text()"/>

    <xsl:template match="menu">
      <xsl:for-each select="ancestor::menu">
        <xsl:text>   </xsl:text>
      </xsl:for-each>

      <xsl:value-of select="@label"/>
      <xsl:text>
</xsl:text>

      <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="menu-item">
      <xsl:for-each select="ancestor::menu">
        <xsl:text>   </xsl:text>
      </xsl:for-each>

      <xsl:value-of select="@label"/>

      <xsl:text>
</xsl:text>

    </xsl:template>
</xsl:stylesheet>

krijg ik keurig deze output:
code:
1
2
3
4
5
6
Drinks
   Add a mix
   View drinks
    Per category
    View all drinks
   Search a drink

Precies wat je wilde dus :) . Je kunt het zelfs nog een stukje compacter opgeschrijven. Merk op hoe compact en simpel de echte XPath expressie eigenlijk is...

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
toppie!

Heb je trouwens nog nagedacht om dat voorbeeld om alle nodes te pakken behalve die de namespace 'namespacenaam' hebben? (zie [xml/xsl] internationalization)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
hum nee, was het vergeten :o .

Maar het wordt lastig... Je kunt voor zover ik weet geen predicaten gebruiken over xml namespaces... Gevolg hiervan is dat je alleen maar kunt selecteren welke namespace je wel wilt zien. Ik zie dus geen mogelijkheid, maar ken ook niet heel XPath uit m'n hoofd ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
is wel vaag dan... not(tagname) bijv werkt ook niet, terwijl het volgens mij toch een een correcte expressie is...

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ah, ik zie toch nog iets: Misschien dat je iets met de XPath function "namespace-uri" kunt doen. Als je daar een not omheen zet moet dat wel gaan werken... :)

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Het werkt inderdaad :). Nog even een traditioneel voorbeeldje:

Input:
code:
1
2
3
4
5
6
7
<?xml version="1.0"?>

<blaat xmlns:x="www.pandoramix.org/blaat">
    <x:test>Dit is content 1</x:test>
    <test>Dit is content 2</test>
    <x:test>Dit is content 3</x:test>
</blaat>

Stylesheet:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
    <xsl:output method="xml" encoding="utf-8"/>
          
    <xsl:template match="text()"/>

    <xsl:template match="blaat">
      <result>
        <xsl:apply-templates/>
      </result>
    </xsl:template>    
      

    <xsl:template match="test[not(namespace-uri()='http://www.pandoramix.org/blaat')]">
      <text>
        <xsl:value-of select="text()"/>
      </text>
    </xsl:template>
</xsl:stylesheet>

resultaat:
code:
1
2
3
4
<?xml version="1.0" encoding="utf-8"?>
<result>
     <text>Dit is content 2</text>
</result>

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Oeps. dit voorbeeld klopt totaal niet.... moment

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Dit is beter...
code:
1
2
3
4
5
6
7
<?xml version="1.0"?>

<blaat xmlns:x="http://www.pandoramix.org/blaat">
    <x:test>Dit is content 1</x:test>
    <test>Dit is content 2</test>
    <x:test>Dit is content 3</x:test>
</blaat>

Met deze stylesheet:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
    <xsl:output method="xml" encoding="utf-8"/>
          
    <xsl:template match="text()"/>

    <xsl:template match="blaat">
      <result>
        <xsl:apply-templates/>
      </result>
    </xsl:template>    
      

    <xsl:template match="*[local-name()='test' and not(namespace-uri()='http://www.pandoramix.org/blaat')]">
      <text>
        <xsl:value-of select="text()"/>
      </text>
    </xsl:template>
</xsl:stylesheet>

levert dit weer dezelfde output, maar nu vanwege de goede reden:
code:
1
2
3
4
<?xml version="1.0" encoding="utf-8"?>
<result>
   <text>Dit is content 2</text>
</result>

Als je de namespace van 'x' verandert zul je zien dat ook de andere content erin voor gaat komen:
code:
1
2
3
4
5
6
7
<?xml version="1.0"?>

<blaat xmlns:x="http://www.pandoramix.org/boeh">
    <x:test>Dit is content 1</x:test>
    <test>Dit is content 2</test>
    <x:test>Dit is content 3</x:test>
</blaat>

wordt nu:
code:
1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>

<result>
    <text>Dit is content 1</text>
    <text>Dit is content 2</text>
    <text>Dit is content 3</text>
</result>

Dat ziet er beter uit :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
tenk joe! (voor de zoveelste keer, je zou d'r geld voor moeten vragen ;))

Toch blijf ik het vaag vinden dat not(tagname) of not(namespacenaam:*) expressies ook niet werken. Is dit een bug of een feature? De syntax is imo namelijk juist, je keert de expressie gewoon om, als 'tagname' een match geeft, zou 'not(tagname)' geen match moeten geven

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Mas*Mind: je zou d'r geld voor moeten vragen ;)
Goed idee! >:) ;) .
Toch blijf ik het vaag vinden dat not(tagname) of not(namespacenaam:*) expressies ook niet werken. Is dit een bug of een feature?
Hum, ik weet het niet zo uit mijn hoofd.... Ik geloof dat ik dit in Xalan weleens heb gebruikt.

Het is een beetje het probleem van de grote hoeveelheid syntaxtische suiker die is toegestaan (en ook nodig is) in XPath. Je kunt allerlei zaken weglaten etc.

Probeer het anders eens met een count? :)

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Op maandag 21 januari 2002 11:01 schreef mbravenboer het volgende:
Probeer het anders eens met een count? :)
:? Hoe bedoel je dat?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Als je wilt checken of een node bestaat kan je ook een count doen over de xpath expressie en en het resultaat vergelijken met 0 oid.

Bijv:
code:
1
not(tagname)

kan je ook schrijven als
code:
1
not( count(current()/tagname) > 0))

Ik vind dat je zo wat 'zekerder' weet wat je noteert.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
ah ok, dat werkt idd wel... :)

/me vind toch dat not(tagname) logischerwijs ook zou moeten werken

Verwijderd

Op vrijdag 18 januari 2002 16:48 schreef Nielsz het volgende:
Heren, ik zie 2 mensen die hun postcount omhoog willen halen, we hebben ook nog een editknop hoor ;)
Wil ik ook! Sorry maar ik weet nix van xml/wml/xsl
Pagina: 1