[XSL] Wat doe ik fout? (Newbie)

Pagina: 1
Acties:

  • oZy
  • Registratie: Juli 2001
  • Laatst online: 12:44
** Als je je snel irriteert aan beginners, doe me een plezier en druk op backspace! Tnx :> **

OK, mijn probleem is duidelijk.. eerste aanvaring met XML/XSL (i know, where have i been!) en ik heb net dat ene zetje in de juiste richting nodig.. ben al de hele dag aan het prutsen maar volgens mij gaat het steeds nét fout :'(

XML:
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
<?xml version="1.0" encoding="ISO-8859-1" ?> 
  <Informations>
    <Information>
      <ID>
        <Number>36289</Number> 
      </ID>
      <Version>
        <Traffic>
          <Message>
            <Data>
              <Class>0</Class> 
              <Text>Blaat</Text> 
            </Data>
            <Data>
              <Class>1</Class> 
              <Text>Hmm</Text> 
            </Data>
            <Data>
              <Class>2</Class> 
              <Text>Test</Text> 
            </Data>
          </Message>
        </Traffic>
      </Version>
    </Information>
    <Information>
      <ID>
        <Number>36295</Number> 
      </ID>
      <Version>
        <Traffic>
          <Message>
            <Data>
              <Class>0</Class> 
              <Text>Blabla</Text> 
            </Data>
            <Data>
              <Class>1</Class> 
              <Text>Aha!</Text> 
            </Data>
            <Data>
              <Class>2</Class> 
              <Text>1.. 2.. 3..</Text> 
            </Data>
          </Message>
        </Traffic>
      </Version>
    </Information>
  </Informations>

XSL:
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
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">
 
  <xsl:output method="html"/>
  <xsl:template match="/">

    <HTML>
      <HEAD>
        <TITLE>XML Test</TITLE>
      </HEAD>
      <BODY>

        <xsl:for-each select="/Informations/Information">
          <b><u><xsl:value-of select="ID/Number"/></u></b><br />
          <xsl:for-each select="Version/Traffic/Message/Data">
            <xsl:value-of select="Class"/><br />
            <xsl:value-of select="Text"/><br />
          </xsl:for-each><hr />
        </xsl:for-each>

      </BODY>
    </HTML>

  </xsl:template>
</xsl:stylesheet>
Zit achter firewall dus kan helaas niet online zetten. In IE zie ik netjes de <br />'s en <hr /> maar voor de rest niets. Als ik de source bekijk zie ik (tot mijn verbazing) mijn XSL code..

Ik transformeer het mbv ASP:
ASP.NET Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
<%
  set xml = Server.CreateObject("Microsoft.XMLDOM")
  xml.load("traffic.xml")
  xml.async = false 

  set xsl = Server.CreateObject("Microsoft.XMLDOM")
  xsl.load(Server.MapPath("traffic.xsl"))
  xsl.async = false 

  Response.Write(xml.transformNode(xsl))
%>
Ik snap dat het in de XSL fout gaat.. maar ik kom er gewoon niet uit waar precies. Ik heb de tutorial van xfront doorgewerkt, en alle XML posts van mbravenboer gelezen als referentie, en ik zie daarin een hele berg interessante mogelijkheden met XSL.. alleen moet ik dit eerst eens aan de praat krijgen voordat ik verder kan. Bvd!

  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
tranformeert het zakie wel?

  • oZy
  • Registratie: Juli 2001
  • Laatst online: 12:44
ik denk van niet.. anders zou ik geen xsl code moeten zien i guess.. maar ik krijg geen foutmeldingen van IIS terug dat de code niet uitgevoerd wordt oid :?

  • robjanssen
  • Registratie: September 2001
  • Laatst online: 02-08 16:10

robjanssen

Software Developer

code:
1
xml.load("traffic.xml")

Moet zijn:
code:
1
xml.load(Server.MapPath("traffic.xml"))

  • oZy
  • Registratie: Juli 2001
  • Laatst online: 12:44
robjanssen schreef op 09 september 2002 @ 19:52:
code:
1
xml.load("traffic.xml")

Moet zijn:
code:
1
xml.load(Server.MapPath("traffic.xml"))
Lijkt me niet dat dit wat uitmaakt. Ik denk dat de transformatie gewoon niet werkt. Ik zal morgen even bij netwerkbeheer nagaan wat er allemaal geïnstalleerd is op de webservers.

Denken jullie dat de XML/XSL wel deugt, afgezien van de transformatie problemen? Benieuwd of ik het een beetje logisch inelkaar geflanst heb.

edit:
Hmm, heb het hele zakie ff op webserver geknalt (in PHP weliswaar, maar xml/xsl blijft hetzelfde), en het werkt prima :) Nu alleen nog aan de gang krijgen @ IIS.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Je vroeg erom ;) .
oZy:
code:
1
2
3
4
5
6
7
        <xsl:for-each select="/Informations/Information">
          <b><u><xsl:value-of select="ID/Number"/></u></b><br />
          <xsl:for-each select="Version/Traffic/Message/Data">
            <xsl:value-of select="Class"/><br />
            <xsl:value-of select="Text"/><br />
          </xsl:for-each><hr />
        </xsl:for-each>
Dit is een werkwijze die typisch is voor imperatieve programmeurs: stop maar zo veel mogelijk in for-loops ;) . In XSLT zou je het gebruik van for-each tot het minimum moeten zien te beperken. De basis (en de kracht) van XSLT zit namelijk in het recursieve aspect dmv het steeds opnieuw toepassen van templates. Werk dus meer meerdere templates en pas deze toe mbv apply-templates ipv je huidige for-each constructie.

Verder zou ik ook de value-ofs vertalen naar templates omdat het duidelijker, fraaier en beter te hergebruiken is.

Tot slot zou ik een beetje op mijn HTML letten: bij voorkeur werken met XHTML (wat echt niet moelijk is), maar in ieder geval die hoofdletters weglaten.

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


  • robjanssen
  • Registratie: September 2001
  • Laatst online: 02-08 16:10

robjanssen

Software Developer

Toch zou ik mijn manier maar eens proberen!!!!

(Krijg je wel je titel boven aan de pagina? XML Test)

  • oZy
  • Registratie: Juli 2001
  • Laatst online: 12:44
mbravenboer schreef op 10 september 2002 @ 06:31:
Je vroeg erom ;) .

[...]

Dit is een werkwijze die typisch is voor imperatieve programmeurs: stop maar zo veel mogelijk in for-loops ;) . In XSLT zou je het gebruik van for-each tot het minimum moeten zien te beperken. De basis (en de kracht) van XSLT zit namelijk in het recursieve aspect dmv het steeds opnieuw toepassen van templates. Werk dus meer meerdere templates en pas deze toe mbv apply-templates ipv je huidige for-each constructie.

Verder zou ik ook de value-ofs vertalen naar templates omdat het duidelijker, fraaier en beter te hergebruiken is.

Tot slot zou ik een beetje op mijn HTML letten: bij voorkeur werken met XHTML (wat echt niet moelijk is), maar in ieder geval die hoofdletters weglaten.
/me is zeer vereerd met deze privé tutoring van de guru himself ;)
Ik heb die templates manier ook gezien (en geprobeert) maar dat ging niet helemaals zoals het hoort, dus tja.. *shame on me* Ik ga er in ieder geval gelijk mee aan de slag.

Betreft de XHTML, je hebt helemaal gelijk. Maar afgezien van de <CAPS> is het toch wel redelijk volgens de standaard toch? Dat komt goed iig.

robjanssen, bedankt voor je hulp, maar met of zonder de Server.MapPath blijft het resultaat hetzelfde. Welke software moet er eigenlijk op IIS draaien om een beetje met XSLT aan de gang te kunnen? Als ik nu de 'bron bekijk' van het resultaat van de ASP file, krijg ik simpel weg dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html" />
  <xsl:template match="/">
    <html>
      <head>
        <title>XML Test</title>
      </head>
      <body>
        <xsl:for-each select="/Informations/Information">
          <b><u><xsl:value-of select="ID/Number" /></u></b><br />
          <xsl:for-each select="Version/Traffic/Message/Data">
            <xsl:value-of select="Class" /><br />
            <xsl:value-of select="Text" /><br />
          </xsl:for-each><hr />
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>
Ik zie wel de titel (XML Test) maar de xsl wordt verder niet verwerkt.

  • RM-rf
  • Registratie: September 2000
  • Laatst online: 11:48

RM-rf

1 2 3 4 5 7 6 8 9

snel gokje:
code:
1
2
3
<xsl:template match="/">
...
<xsl:for-each select="/Informations/Information">

probeer van die tweede eens: <xsl:for-each select="Informations/Information">;
dus zonder de eerste slash (immers je matched al op de root)

Intelligente mensen zoeken in tijden van crisis naar oplossingen, Idioten zoeken dan schuldigen


  • oZy
  • Registratie: Juli 2001
  • Laatst online: 12:44
Ok mbravenboer, zo beter?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">
 
  <xsl:output method="html"/>
  <xsl:template match="/Informations/Information">

    <html>
      <head>
        <title>XML Test</title>
      </head>
      <body>
        <xsl:apply-templates select="Version/Traffic/Message/Data" />
      </body>
    </html>
  </xsl:template>

  <xsl:template match="Version/Traffic/Message/Data">
    <xsl:value-of select="Class" /><br />
    <xsl:value-of select="Text" /><br />
  </xsl:template>

</xsl:stylesheet>

edit:
Oh trouwens, het werkt nu prima, op beide manieren (for each / templates). tnx voor alle hulp!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
oZy: zo beter?
Ziet er al een stuk aangenamer uit :) . Ik kan zien dat je in ieder geval ongeveer begrijpt wat de 'betere' aanpak inhoudt :) . Omdat ik toch wat te zeuren moet hebben een paar puntes:

code:
1
2
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">

Persoonlijk gebruik ik tegenwoordig altijd 'transform' ipv 'stylesheet'. Het is allebei hetzelfde, dus het maakt verder niets uit. Ik doe dit omdat XSLT imho niets met stylesheets te maken heeft, maar simpelweg een transformatie taal voor XML is. Een XSLT file is dus een transformatie en vandaar mijn keuze voor transform.

code:
1
2
3
4
5
  <xsl:template match="/Informations/Information">
    <html>
       ....
    </html>
  </xsl:template>


Deze begrijp ik niet helemaal. Je maakt hier een template voor de elementen Informations/Information. Ziet er op zich fantastisch uit, maar ik zie twee keer een Information element in je voorbeeld. Je krijgt dan dus in principe 2 html documenten achter elkaar:

code:
1
2
3
4
5
6
    <html>
       ....
    </html>
    <html>
       ....
    </html>


Als je de output-method xml zou gebruiken, zou het resultaat dus niet well-formed zijn. Ik weet niet precies wat je bedoeling is, maar ik vermoed dat je misschien een html document aan wilt gaan maken in het Informations element.

Ik neem aan dat je weet hoe tijdens de transformatie Informations/Information bereikt wordt? Dit gebeurt door het default-template die templates toepast op alle kinderen. Het is prima om dit te gebruiken, maar zorg er wel voor dat je weet waarom het goed gaat :) .

code:
1
    <xsl:value-of select="Class" /><br />

Persoonlijk probeer ik bij een value-of nooit te verwijzen naar een element, maar geef expliciet aan dat ik de text node in het element wil hebben. Zo dus:

code:
1
    <xsl:value-of select="Class/text()" /><br />


Omdat er echter een default template voor een text node is (die de inhoud oplevert) kan je ook dit doen:

code:
1
    <xsl:apply-templates select="Class" /><br />

Dit heeft als voordeel dat je ooit nog een template zou kunnen toevoegen voor "Class', waarbij het gedrag gelijk overal in de transformatie wordt aangepast. Als je expliciet value-ofs gebruikt, is dit niet mogelijk en geef je dus keihard aan wat voor resultaat je wilt. Je ziet dus weer: zo veel mogelijk templates gebruiken :) .
Oh trouwens, het werkt nu prima
Mooi :) .

Tot slot nog even een standaard stukje XSLT wat je kan gebruiken als je over wilt stappen op het opbouwen van XHTML ipv HTML:

code:
1
2
3
4
5
6
7
8
<xsl:transform version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:html="http://www.w3.org/1999/xhtml">

  <xsl:output method="xml" indent="yes" encoding="UTF-8"
        doctype-public="-//W3C//DTD XHTML 1.1//EN"
        doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"/>


Veel plezier met transformeren! :9~

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


  • robjanssen
  • Registratie: September 2001
  • Laatst online: 02-08 16:10

robjanssen

Software Developer

Heb je scripts uitvoeren wel aanstaan op je webserver?

  • oZy
  • Registratie: Juli 2001
  • Laatst online: 12:44
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
<?xml version="1.0"?>
<xsl:transform version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:html="http://www.w3.org/1999/xhtml">

  <xsl:output method="xml" indent="yes" encoding="UTF-8"
        doctype-public="-//W3C//DTD XHTML 1.1//EN"
        doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"/>

  <xsl:template match="/Informations">

    <html>
      <head>
        <title>XML Test</title>
      </head>
      <body>
        <xsl:apply-templates select="Information" />
      </body>
    </html>
  </xsl:template>


  <xsl:template match="Information">
    <xsl:apply-templates select="Version/Traffic/Message/Data" /><br />
  </xsl:template>

  <xsl:template match="Version/Traffic/Message/Data">
    <xsl:apply-templates select="Class" />
    <xsl:apply-templates select="Text" />
  </xsl:template>

  <xsl:template match="Class">
    <span style="font-weight:bold;"><xsl:value-of select="." />: </span>
  </xsl:template>

  <xsl:template match="Text">
    <xsl:value-of select="." /><br />
  </xsl:template>

</xsl:transform>

Bedoelde je zoiets?
Transformeren is zeker :9~ :9~

  • oZy
  • Registratie: Juli 2001
  • Laatst online: 12:44
robjanssen schreef op 11 september 2002 @ 07:45:
Heb je scripts uitvoeren wel aanstaan op je webserver?
rob, nogmaals bedankt voor je hulp! Ik heb het probleem inmiddels gevonden.. op onze webservers staat MSXML 4.0, het probleem was dus dat ik Server.Createobject("MSXML2.DomDocument") moest gebruiken ipv Server.CreateObject("Microsoft.XMLDOM"). Alles werkt nu! :*)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
oZy: Bedoelde je zoiets?
Prima! Helemaal naar mijn smaak :*) .

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


  • Stephan Oudmaijer
  • Registratie: Oktober 2000
  • Laatst online: 16-08-2023
wel relaxed die snelle replies van mbravenboer, hoef ik of een ander het niet te doen :P

  • oZy
  • Registratie: Juli 2001
  • Laatst online: 12:44
* mbravenboer == liev :>

Zo komen we tenminste nog ergens met dit forum! Heb een hoop geleerd deze 3 dagen over xml/xsl/xslt en volgens mij is dit gelijk een waardevolle topic voor een nieuwe lichting xslt pioniers! Nogmaals, bedankt.. ik hoop de xml helpdesk nu ook enigzins te kunnen bijvallen :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
oZy: * mbravenboer == liev :>
Sorry, ik ben al bezet ;) .
volgens mij is dit gelijk een waardevolle topic voor een nieuwe lichting xslt pioniers!
Een hele tijd geleden was er een golf van XSLT topics in P&W. Dat was een leuke tijd :*) . Om de een of andere reden is het de laatste tijd vrij stil geweest rond XSLT in P&W. Misschien dat er weer betere tijden aanbreken :) . Als er enthousiaste 'helpers' zijn, komen er ook meestal wel snel meer topics 8) .

Ik denk dat mensen die met XSLT bezig zijn vaak vanuit een iets professionelere achtergrond (werkend of hogere studie) een vraag stellen. Misschien dat dit ook bijdraagt aan het leukheidsgehalte van XSLT topics ...

Het is ook wel grappig om te zien hoe iedere programmeur met vooral ervaring in imperatieve talen echt op exact dezelfde manier aan de slag gaat met XSLT. Het verhaal over for-each versus templates heb ik hier (en op andere fora) al vele keren (met succes ;) ) gehouden. Het ontbreken van een assignment is een andere bekende frustratie voor deze groep programmeurs. Misschien dat er te weinig wordt beseft dat je niet zomaar op een compactere (hum, dat klinkt vreemd in de context van XSLT ;) ) methode overstapt om een transformatie te specificeren, maar je met een fundamenteel ander paradigma te maken krijgt.... (sommigen wagen dit zelfs functioneel te noemen :X ;) ) .

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


  • oZy
  • Registratie: Juli 2001
  • Laatst online: 12:44
Ik denk dat ik niet de enige ben als ik zeg dat ik een hele tijd gewoon niet het nut van xml/xsl heb ingezien. Misschien komt dat door mijn imperatieve achtergrond, of juist omdat ik nu pas het voordeel ervan kan zien omdat ik met grote/ingewikkelde sites bezig ben, en daarnaast gretig gebruik maak van de mogelijkheid om behalve in xhtml, ook in andere formaten te transformeren.

Bovendien merk ikzelf dat binnen het (grote) bedrijfsleven (die toch wel meer dan een beetje invloed hebben op het succes van bepaalde technieken qua webdesign/webdevelopment) XML als een kostbare / tijdrovende verandering gezien wordt, mede omdat het voor minder begane mensen (veelal de mensen die de besluiten nemen) het concrete nut van XML niet duidelijk is.

  • oZy
  • Registratie: Juli 2001
  • Laatst online: 12:44
*Schop* nieuw vraagje mbt deze XML/XSL files; topic is ruim genoeg om dit met een schop te doen :)

mijn vraag: ik wil de gegevens sorteren mbv XSL. Ik heb nu dit:
code:
1
2
3
4
5
6
7
  <xsl:template match="Information">
    <file>
      <xsl:apply-templates select="Version/Traffic/Message">
        <xsl:sort select="Data[1]/Text" />
      </xsl:apply-templates>
    </file>
  </xsl:template>

Alleen dat werkt dus niet. Wat ik ook invul bij de sort, niets lijkt de output te veranderen. Alle [Message] nodes moeten dus gesorteerd worden op de waarde in de eerste [Data/Text] node. Iemand een idee?

  • MisterData
  • Registratie: September 2001
  • Laatst online: 26-08 21:52
mbravenboer schreef op 12 september 2002 @ 00:14:
[..]

Een hele tijd geleden was er een golf van XSLT topics in P&W. Dat was een leuke tijd :*) . Om de een of andere reden is het de laatste tijd vrij stil geweest rond XSLT in P&W. Misschien dat er weer betere tijden aanbreken :) . Als er enthousiaste 'helpers' zijn, komen er ook meestal wel snel meer topics 8) .
Lijkt me leuk :) Ik ben nu bezig met een XML-uitbreiding van m'n forum en ik vind het leuk en handig, dat XSLT :)
Ik denk dat mensen die met XSLT bezig zijn vaak vanuit een iets professionelere achtergrond (werkend of hogere studie) een vraag stellen. Misschien dat dit ook bijdraagt aan het leukheidsgehalte van XSLT topics ...
Kijken naar hoe de profs het doen is altijd leuk en leerzaam :)
Pagina: 1