Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[XSLT] Transformeren, met afhankelijkheid

Pagina: 1
Acties:
  • 167 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Het kan aan mij liggen, maar ik vind XSLT een zeer bittere pil.
Ik tracht een xml file:
XML:
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
85
86
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="webshop.xslt"?>

<webshop xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation='webshop.xsd' >
    <klanten>
    
        <klant klantid="klant0001">
            <voornaam>Henk</voornaam>
            <achternaam>Vries</achternaam>
            <email>nono@gmail.com</email>
            <telefoon>0184411111</telefoon>
            <postadres>
                <straat>Laan</straat>
                <huisnummer>52</huisnummer>
                <postcode>1122AB</postcode>
                <plaats>Rectum</plaats>
                <land>Nederland</land>
            </postadres>
        </klant>
        
        <klant klantid="klant0002">
            <voornaam>Pietje</voornaam>
            <achternaam>Bell</achternaam>
            <email>pietje.bell@gmail.com</email>
            <telefoon>0184411111</telefoon>
            <postadres>
                <straat>Anderestraat</straat>
                <huisnummer>152</huisnummer>
                <postcode>3326AB</postcode>
                <plaats>Dordrecht</plaats>
                <land>Nederland</land>
            </postadres>
        </klant>

    </klanten>

    
    <orders>
        
        <order orderid="order0001" klantid="klant0001">
            <orderregels>
                <orderregel artikelid="artikel0001" aantal="2" />
                <orderregel artikelid="artikel0002" aantal="3" />
            </orderregels>
        </order>
            
        <order orderid="order0002" klantid="klant0001">
            <orderregels>
                <orderregel artikelid="artikel0003" aantal="1" />
            </orderregels>
        </order>
        
        <order orderid="order0003" klantid="klant0002">
            <orderregels>
                <orderregel artikelid="artikel0003" aantal="1" />
                <orderregel artikelid="artikel0001" aantal="2" />
                <orderregel artikelid="artikel0002" aantal="3" />
            </orderregels>
        </order>
        
    </orders>

    <artikelen>
        
        <artikel artikelid="artikel0001">
            <titel>Prachtig Artikel</titel>
            <omschrijving>Prachtige dakbedekking</omschrijving> 
            <prijs> 15,00</prijs>      
        </artikel>
        
        <artikel artikelid="artikel0002">
            <titel>Prima Artikel</titel>
            <omschrijving>Prima artikel om te gebruiken als wandvulling en isolatiemateriaal</omschrijving>
            <prijs> 20,00</prijs>          
        </artikel>
        
        <artikel artikelid="artikel0003">
            <titel>Absoluut Topartikel</titel>
            <omschrijving>De absolute top als het gaat om schoenzoolvulling</omschrijving>
            <prijs> 50,00</prijs>          
        </artikel>
        
    </artikelen>

</webshop>

Door middel van een xsd schema te laten valideren, dat werkt helemaal prima en was ook niet zo heel moeilijk door het gebruik van <complexType> en aanverwante zaken.

Maar nu XSLT.
Ik heb voor een ogen dat ik een mooie html uitgepoept krijg met daarin 3 orders, met bijbehorende klantgegevens
zoiets:
code:
1
2
3
4
5
6
7
8
9
10
11
Order: order0001
Klant: klant0001
N
A //gewoon NAW gegevens
W

Artikelen:
Naam: Prachtig Artikel
Aantal: 2
Naam: Prima Artikel
Aantal:3

Maar ik loop er echt helemaal op stuk, ik begrijp echt totaal niet hoe die referenties werken. Ik heb hier verschillende presentaties, voorbeelden en bestanden, maar begrijp de logica echt helemaal niet.

Kan iemand me hiermee een stukje op weg helpen, ik weet dat dit niet helemaal de 'way to go' is hier, maar ik ben in de war :p

Ik weet ongeveer hoe ik templates moet toepassen:
XSLT:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl='http://www.w3.org/1999/XSL/Transform' >
    
        <!-- root match -->
    <xsl:template match="/">
        <xsl:apply-templates />
    </xsl:template>
    
    <!-- klant template-->
    <xsl:template match="webshop/klanten/klant">
        <h1>ORDERGEGEVENS</h1>
        <b>Naam: </b><xsl:apply-templates select="voornaam" /> <xsl:apply-templates select="achternaam" />
    </xsl:template>
    
    <xsl:template match="voornaam">
        <xsl:value-of select="." />
    </xsl:template>
    
    <xsl:template match="achternaam">
        <xsl:value-of select="." /><br />
    </xsl:template>
    
    
</xsl:stylesheet>


Maar hoe kan ik nu het klantid aan een orderid verbinden, binnen <order> is een klantid bekend, maar klant 1 heeft 2 orders, dit wil ik als 2 aparte order in mijn html laten weergeven.
Hoe ga ik om met deze attributen binnen een tamplate?

ALle hulp is meer dan welkom!

Edit: Ik merk al dat ik het geheel verkeerd aanpak, ik moet redeneren vanuit de order niet vanuit de klant

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Als jij primair je orders wil laten zien (met daarbij de klantinformatie en de artikelinformatie) moet je je XSLT ook een beetje zo indelen. Ik denk dat je structuur er ongeveer zo uit moet zien:

code:
1
2
3
4
5
6
7
8
template: /orders
    apply-templates order

template: order
     print order-id
     apply-templates /klanten/klant[@id = klant/@id]
     foreach artikel:
           apply-templates /artikelen/artikel[@id = ./@id]

Rustacean


Verwijderd

Topicstarter
Ja, inderdaad, maar wat ik dus niet snap, als ik een match maak naar:
code:
1
2
3
4
5
<xsl:template match="webshop/orders/order">
        <h1>Order</h1>
        <b>Orderid: </b><xsl:value-of select="@orderid" /><br />
        <b>Naam: HIER </b>
    </xsl:template>

Wil ik op de plaats van HIER, een template aanroepen welke uit webshop/klanten/klant de klant haal die geassocieerd is met
<order orderid="order0001" klantid="klant0001"> melp </order>

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Ik denk dat dit zoiets zou moeten werken:

code:
1
<xsl:apply-templates select="/webshop/klanten/klant[@klantid = ./@klantid]" />


Je moet dan dus wel een aparte template maken voor "klant", maar dat is sowieso wat netter dan je klantgegevens gewoon in je order template knallen.

[ Voor 37% gewijzigd door djc op 31-10-2007 12:54 ]

Rustacean


Verwijderd

Topicstarter
Dat komt inderdaad in de richting ja :-)
Maar, nu worden alle klanten geprint:
XML:
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" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl='http://www.w3.org/1999/XSL/Transform' >
<xsl:output method="html"/>
        
    <xsl:template match="webshop/orders/order">
        <h1>Order</h1>
        <b>Orderid: </b><xsl:value-of select="@orderid" /><br />
        <b>Gegevens:</b><br />
        
        <xsl:apply-templates select="/webshop/klanten/klant[@klantid = ./@klantid]" />
            
    </xsl:template>
    <!--  -->
        <xsl:template match="webshop/klanten/klant">
          <b>Naam: </b><xsl:value-of select="voornaam" /> <xsl:value-of select="achternaam" /><br />
          <b>Email: </b><xsl:value-of select="email" /><br />
          <b>Telefoon: </b><xsl:value-of select="telefoon" /><br />
        
    </xsl:template>
    
</xsl:stylesheet>

+ nog een keer bovenaan de pagina
Dit is natuurlijk logisch, want er wordt een match gevonden met
code:
1
webshop/klanten/klant


Het is voor mij nog koffiedik kijken, maar ik heb:
code:
1
<xsl:apply-templates select="/webshop/klanten/klant[@klantid = ./@klantid]" />

Dus heb ik mijn natte vinger even tegen mijn onderbuik aan gehouden en kwam tot de op niets gebaseerde conclusie dat dit altijd 'true' oplevert (mag je hier wel van spreken binnen deze context), terwijl je eigenlijk iets als (sql à la fantasie):
SQL:
1
SELECT klantgevevens FROM klanten, orders WHERE klantgegevens.klantid = orders.klantid

Nu heb ik wat kunstzinnige constructies geprobeerd als, wat telkens resulteerde in een EOF fout, of geen data, of node check errors :+

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Mja, dat zat er dik in. Is een beetje onfortuinlijk dat beide attributen klantid heten. Het moet wel kunnen, maar ik weet niet precies hoe de scoping in dit soort XPath expressies werkt. Je zou er even de XPath spec op na kunnen slaan. Zo te zien heb je het principe in ieder geval wel door. :)

Rustacean


Verwijderd

Topicstarter
Is een beetje onfortuinlijk dat beide attributen klantid heten
Daar heb ik eigenlijk helemaal nog niet bij stil gestaan, eens kijken wat dat oplevert.

Edit:
Niets dus :-(
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<orders>
        
        <order orderid="order0001" klantidref="klant0001">
            <orderregels>
                <orderregel artikelidref="artikel0001" aantal="2" />
                <orderregel artikelidref="artikel0002" aantal="3" />
            </orderregels>
        </order>
            
        <order orderid="order0002" klantidref="klant0001">
            <orderregels>
                <orderregel artikelidref="artikel0003" aantal="1" />
            </orderregels>
        </order>
        
        <order orderid="order0003" klantidref="klant0002">
            <orderregels>
                <orderregel artikelidref="artikel0003" aantal="1" />
                <orderregel artikelidref="artikel0001" aantal="2" />
                <orderregel artikelidref="artikel0002" aantal="3" />
            </orderregels>
        </order>
        
    </orders> 

Ik heb dus binnen order klantid aangepast naar klantidref wat me, na wat geknoei, nog steeds hetzelfde oplevert: niks dus.

[ Voor 78% gewijzigd door Verwijderd op 31-10-2007 14:46 ]


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Beproefde debugmethode: lekker meuk in je output tree zetten, gewoon even kijken wat voor variabelen je hebt om mee te werken.

Rustacean


Verwijderd

Topicstarter
Oké het werkt gedeeltelijk, maar volgens mij kan er iets niet wat ik wil.
AL die xml en xslt code is slechts ter illustratie, verderop pik er wat specifieke dingen uit.
XML:
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
85
86
87
88
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="webshop.xslt"?>

<webshop xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation='webshop.xsd' >
    <klanten>
    
        <klant klantid="klant0001">
            <voornaam>Ssdsdsdn</voornaam>
            <achternaam>Stsdd</achternaam>
            <email>ssdsd.sdsdij@gmail.com</email>
            <telefoon>0184411111</telefoon>
            <postadres>
                <straat>Ksdsdsd</straat>
                <huisnummer>32322</huisnummer>
                <postcode>3233AD</postcode>
                <plaats>Sliedrecht</plaats>
                <land>Nederland</land>
            </postadres>
        </klant>
        
        <klant klantid="klant0002">
            <voornaam>Pietje</voornaam>
            <achternaam>Bell</achternaam>
            <email>pietje.bell@gmail.com</email>
            <telefoon>0184411611</telefoon>
            <postadres>
                <straat>Anderestraat</straat>
                <huisnummer>152</huisnummer>
                <postcode>3126AX</postcode>
                <plaats>Daar</plaats>
                <land>Nederland</land>
            </postadres>
        </klant>

    </klanten>

    
    <orders>
        
        <order orderid="order0001" klantidref="klant0001">
            <orderregels>
                <orderregel artikelidref="artikel0001" aantal="2" />
                <orderregel artikelidref="artikel0002" aantal="3" />
            </orderregels>
        </order>
            
        <order orderid="order0002" klantidref="klant0001">
            <orderregels>
                <orderregel artikelidref="artikel0003" aantal="1" />
            </orderregels>
        </order>
        
        <order orderid="order0003" klantidref="klant0002">
            <orderregels>
                <orderregel artikelidref="artikel0003" aantal="1" />
                <orderregel artikelidref="artikel0001" aantal="2" />
                <orderregel artikelidref="artikel0002" aantal="3" />
            </orderregels>
        </order>
        
    </orders>

    <artikelen>
        
        <artikel artikelid="artikel0001">
            <titel>Prachtig Artikel</titel>
            <omschrijving>Prachtige dakbedekking</omschrijving> 
            <prijs> 15,00</prijs>      
        </artikel>
        
        <artikel artikelid="artikel0002">
            <titel>Prima Artikel</titel>
            <omschrijving>Prima artikel om te gebruiken als wandvulling en isolatiemateriaal</omschrijving>
            <prijs> 20,00</prijs>          
        </artikel>
        
        <artikel artikelid="artikel0003">
            <titel>Absoluut Topartikel</titel>
            <omschrijving>De absolute top als het gaat om schoenzoolvulling</omschrijving>
            <prijs> 50,00</prijs>          
        </artikel>
        
            
        
    </artikelen>

</webshop>


Wil ik laten transformeren naar een mooi stukje html met overzichtjes van orders bijbehorende klanten en orderregels met artikelen.
XML:
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
<?xml version="1.0" encoding="UTF-8"?>
<!--    sorry voor deze DTD, maar ik wil graag &nbsp; kunnen gebruiken
        wat XSLT niet toelaat van zichzelf -->
<!DOCTYPE xsl:stylesheet [
  <!ENTITY nbsp " ">
]>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:template match="//webshop/orders/order">
    <p>
        <table border="1">
        
        <tr>
            <td><b>ORDER: </b></td>
        </tr>
        <tr>
            <td>OrderID: </td><td><xsl:value-of select="@orderid" /></td>
        </tr>
        <tr>
            <td>KlantID: </td><td><xsl:value-of select="@klantidref" /></td>
        </tr>
        <tr>
            <td><b>Gegevens: </b></td>
        </tr>
        
        <xsl:call-template name="klantlink">
            <xsl:with-param name="klantref_id">
                <xsl:value-of select="@klantidref" />
            </xsl:with-param>
        </xsl:call-template>
        
        <tr>
            <td><b>Artikelen: </b></td>
        </tr>
        
        <xsl:call-template name="artikelenlink">
            <xsl:with-param name="artikelref_id">
                <xsl:value-of select="orderregels/orderregel/@artikelidref" />
            </xsl:with-param>
        </xsl:call-template>
        
        </table>
    </p>
    </xsl:template>
    
    <xsl:template name="klantlink">
        <xsl:param name="klantref_id">0</xsl:param>
        
            <tr>
                <td>Naam: </td>
                <td><xsl:value-of select="//webshop/klanten/klant[@klantid=$klantref_id]/voornaam"/><xsl:value-of select="//webshop/klanten/klant[@klantid=$klantref_id]/achternaam"/></td>
            </tr><tr>
                <td>Email: </td>
                <td><xsl:value-of select="//webshop/klanten/klant[@klantid=$klantref_id]/email"/></td>
            </tr><tr>
                <td>Telefoon: </td>
                <td><xsl:value-of select="//webshop/klanten/klant[@klantid=$klantref_id]/telefoon"/></td>
            </tr><tr>
                <td><b>Adres:</b></td>
            </tr><tr>
                <td>Straat: </td>
                <td><xsl:value-of select="//webshop/klanten/klant[@klantid=$klantref_id]/postadres/straat"/><xsl:value-of select="//webshop/klanten/klant[@klantid=$klantref_id]/postadres/huisnummer"/></td>
            </tr><tr>
                <td>Postcode: </td>
                <td><xsl:value-of select="//webshop/klanten/klant[@klantid=$klantref_id]/postadres/postcode"/></td>
            </tr><tr>
                <td>Plaats: </td>
                <td><xsl:value-of select="//webshop/klanten/klant[@klantid=$klantref_id]/postadres/plaats"/></td>
            </tr><tr>
                <td>Land: </td>
                <td><xsl:value-of select="//webshop/klanten/klant[@klantid=$klantref_id]/postadres/land"/></td>
            </tr>
        
    </xsl:template>

    <xsl:template name="artikelenlink">
        <xsl:param name="artikelref_id">0</xsl:param>
         <tr>
            <td>Titel</td>
            <td><xsl:value-of select="//webshop/artikelen/artikel[@artikelid=$artikelref_id]/titel" /></td>
        </tr>
        <tr>
            <td>Aantal</td>
            <td><xsl:value-of select="//webshop/orders/orderregels/orderregel[@artikelid=$artikelref_id]/@aantal" /></td>
        </tr>
        <tr>
            <td>Stuksprijs</td>
            <td><xsl:value-of select="//webshop/artikelen/artikel[@artikelid=$artikelref_id]/prijs" /></td>
        </tr>
        <tr>
            <td>Totaalprijs</td>
            <td><xsl:call-template name="BerekenTotaal" /></td>
        </tr>
    </xsl:template>
    
    <xsl:template name="BerekenTotaal" />
    
</xsl:stylesheet>



1)
code:
1
2
<td>Aantal</td>
<td><xsl:value-of select="//webshop/orders/orderregels/orderregel[@artikelid=$artikelref_id]/@aantal" /></td>

Hier probeer ik van een bepaalt artikelid het aantal, wat ook een attribuut is op te vragen, ik vraag mij inmiddels ten zeerste af, is dit uberhaupt mogelijk?
Ik kan natuurlijk gewoon even de XML en XSD aanpassen zodat het wel kan, maar ja waarom makkelijk doen...

2)
Alle informatie uit mijn XML bestand wordt ongeformatteerd op mijn scherm getoond + geformatteerd, dit vind ik wél vreemd want ik gebruik nergens:
code:
1
<template match="/">


3)
Er wordt slechts 1 artikel weergegeven per order, dit snap ik ook niet helemaal.
ik gebruik hiervoor:
code:
1
2
3
4
5
<xsl:call-template name="artikelenlink">
            <xsl:with-param name="artikelref_id">
                <xsl:value-of select="orderregels/orderregel/@artikelidref" />
            </xsl:with-param>
        </xsl:call-template>


Maar binnen:
code:
1
<xsl:template match="//webshop/orders/order">

Dus ik dacht te kunnen verwachten dat alle orderregels per order meegenomen zouden worden.

Again, alle hulp is welkom :>

[ Voor 85% gewijzigd door Verwijderd op 31-10-2007 18:35 ]


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Het is echt niet zo heel ingewikkeld. :P

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
85
86
87
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
    
    <xsl:template match="/">
        <xsl:apply-templates select="webshop/orders/order" />
    </xsl:template>
    
    <xsl:template match="/webshop/orders/order">
        <p>
            <table border="1">
                
                <tr>
                    <td><b>ORDER: </b></td>
                </tr>
                <tr>
                    <td>OrderID: </td><td><xsl:value-of select="@orderid" /></td>
                </tr>
                <tr>
                    <td>KlantID: </td><td><xsl:value-of select="@klantidref" /></td>
                </tr>
                <tr>
                    <td><b>Gegevens: </b></td>
                </tr>
                
                <xsl:variable name="curclient" select="@klantidref" />
                <xsl:apply-templates select="/webshop/klanten/klant[@klantid = $curclient]" />
                
                <tr>
                    <td><b>Artikelen: </b></td>
                </tr>
                
                <xsl:apply-templates select="orderregels/orderregel" />
                
            </table>
        </p>
    </xsl:template>
    
    <xsl:template match="klant">
        
        <tr>
            <td>Naam: </td>
            <td><xsl:value-of select="voornaam"/><xsl:value-of select="achternaam"/></td>
        </tr><tr>
            <td>Email: </td>
            <td><xsl:value-of select="email"/></td>
        </tr><tr>
            <td>Telefoon: </td>
            <td><xsl:value-of select="telefoon"/></td>
        </tr><tr>
            <td><b>Adres:</b></td>
        </tr><tr>
            <td>Straat: </td>
            <td><xsl:value-of select="postadres/straat"/><xsl:value-of select="postadres/huisnummer"/></td>
        </tr><tr>
            <td>Postcode: </td>
            <td><xsl:value-of select="postadres/postcode"/></td>
        </tr><tr>
            <td>Plaats: </td>
            <td><xsl:value-of select="postadres/plaats"/></td>
        </tr><tr>
            <td>Land: </td>
            <td><xsl:value-of select="postadres/land"/></td>
        </tr>
        
    </xsl:template>

    <xsl:template match="orderregel">
        <xsl:variable name="artikel" select="/webshop/artikelen/artikel[@artikelid = ./@artikelid]" />
        <xsl:variable name="prijs" select="number(translate(substring($artikel/prijs, 3), ',', '.'))" />
        <tr>
            <td>Titel</td>
            <td><xsl:value-of select="$artikel/titel" /></td>
        </tr>
        <tr>
            <td>Aantal</td>
            <td><xsl:value-of select="@aantal" /></td>
        </tr>
        <tr>
            <td>Stuksprijs</td>
            <td><xsl:value-of select="$artikel/prijs" /></td>
        </tr>
        <tr>
            <td>Totaalprijs</td>
            <td>€ <xsl:value-of select="@aantal * $prijs" /></td>
        </tr>
    </xsl:template>
    
</xsl:transform>

Rustacean


Verwijderd

Topicstarter
Ik ga het even doornemen en op me in laten werken, maar sowieso _/-\o_

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

En, begrijp je waarom dit werkt/beter is?

Rustacean


Verwijderd

Hi,

Ik ben zo slim geweest mezelf uit het systeem te locken, door het verkeerde emailadres in te tikken bij wijzigen, dus heb ik maar een nieuw aangemaakt ;)

Goed, in het kort: ja, ik begrijp het, maar wel dankzij jou heldere voorbeelden en hulp.
Overigens heb ik de template voor /orderregel een beetje aangepast naar:

XML:
1
2
3
4
5
6
7
8
9
10
11
 <xsl:template match="orderregel">
       <xsl:variable name="artikelref" select="./@artikelidref"/>
        <xsl:variable name="artikel" select="/webshop/artikelen/artikel[@artikelid = $artikelref]"/>
        <xsl:variable name="prijs" select="number(translate(substring($artikel/prijs, 3), ',', '.'))" />
            <tr>
                <td><xsl:value-of select="$artikel/titel" /></td>           
                <td><xsl:value-of select="aantal" /></td>
                <td><xsl:value-of select="$artikel/prijs" /></td>
                <td> <xsl:value-of select="aantal * $prijs" /></td>
            </tr>
    </xsl:template>


Zoals je misschien al doorhad is dit een huiswerkopgave en nu is het gewoon duidelijk, ik snap hoe je zelf templates maakt, hoe je variabelen gebruikt en hoe de matching werkt, hoe je met attributen om kunt gaan. Ik had dit xml bestand gemaakt (de keuze lag daarin vrij, had ook iets veel simpelers kunnen doen), omdat je hier juist met referenties om moet gaan, maar ik was geloof ik iets te enthousiast, gecombineerd met een griepje, gaat het niet lekker huiswerken.

Mijn dank is verpletterend _/-\o_

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Verwijderd schreef op vrijdag 02 november 2007 @ 16:31:
Zoals je misschien al doorhad is dit een huiswerkopgave en nu is het gewoon duidelijk, ik snap hoe je zelf templates maakt, hoe je variabelen gebruikt en hoe de matching werkt, hoe je met attributen om kunt gaan. Ik had dit xml bestand gemaakt (de keuze lag daarin vrij, had ook iets veel simpelers kunnen doen), omdat je hier juist met referenties om moet gaan, maar ik was geloof ik iets te enthousiast, gecombineerd met een griepje, gaat het niet lekker huiswerken.

Mijn dank is verpletterend _/-\o_
Graag gedaan. Ik was zelf een redelijk groot fan van XSLT (nog steeds wel, maar niet meer zo van XML in het algemeen, plus dat het toch wel erg verbose is), dus toen je zei dat je het een bittere pil vond en naar aanleiding van je voorbeelden tot dan toe vond ik het wel leuk om het je uit te leggen. Mooi dat dat gelukt is.

Rustacean


Verwijderd

Heb er nog even mee zitten spelen, hangt nu een databeestje achter met en paar tabelletjes, java haalt wat info op spuugt wat xml documenten en zo in je browser >:)

Heb er nog wat aan toegevoegd, plaatjes ophalen!
XML:
1
2
3
4
5
6
<!-- named template voor het verwijzen naar een plaatje -->
    <xsl:template name="image">
        <xsl:param name="artikelid_ref">0</xsl:param>
            <b><xsl:value-of select="$artikelid_ref" /></b>
        <img src="{/webshop/artikelen/artikel[@artikelid = $artikelid_ref]/image}"/>
    </xsl:template>


Volgens mij moet het wel gaan lukken op het tentamen

Verwijderd

Topicstarter
Ik durf het bijna niet te zeggen, maar er is nog een ding waar ik niet uitkom, namelijk het optellen van orderregel totalen.

Ik heb getracht de huidige orderregelwaarde in een variabele op te slaan, als volgt:
XML:
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
<xsl:template name="totaalprijs">
        <xsl:param name="orderid_ref">0</xsl:param>
        <xsl:variable name="tmp_subprijs">  
        
            <!-- loop door alle orderregels van de actuele order -->
            <xsl:for-each select="/webshop/orders/order[@orderid=$orderid_ref]/orderregels/orderregel" >
            
                <!-- sla het aantal op de orderregel op in een tmp variabele -->
                <xsl:variable name="tmp_artikelaantal" select="aantal" />
            
                <!-- sla het artikel van de huidige regel op in een tmp variabele -->   
                <xsl:variable name="tmp_artikelid" select="@artikelidref" />
                    
                <!-- sla de prijs van het artikel op in een tmp variabele -->
                <xsl:variable name="tmp_artikelprijs" select="number(translate(substring(/webshop/artikelen/artikel[@artikelid=$tmp_artikelid]/prijs, 3), ',', '.'))" />
                
                <!--  we hebben nu het aantal en de prijs van de orderregel -->
                <xsl:value-of select="$tmp_artikelaantal * $tmp_artikelprijs" /> -->
                
                
                </xsl:for-each> 
        </xsl:variable>
        <xsl:value-of select="$tmp_subprijs" />
        
    </xsl:template>


Dat werkt opzich goed, $tmp_subprijs print alle subtotalen die per order aanwezig zijn.
Maar het optellen van waarden wil niet lukken, ik heb geprobeerd de $tmp_prijs te laten afdrukken binnen een <tag></tag> en een sum(//tag) te doen, maar dat werkte ook niet, terwijl ik daar mijn geld toch wel op het ingezet.

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Verwijderd schreef op zaterdag 03 november 2007 @ 09:46:
Dat werkt opzich goed, $tmp_subprijs print alle subtotalen die per order aanwezig zijn.
Maar het optellen van waarden wil niet lukken, ik heb geprobeerd de $tmp_prijs te laten afdrukken binnen een <tag></tag> en een sum(//tag) te doen, maar dat werkte ook niet, terwijl ik daar mijn geld toch wel op het ingezet.
Het ene werkt op je output tree, terwijl het andere op je input tree werkt, vermoed ik.

Bij dit soort dingen moet je vaak een recursieve template voor call-template met een param maken, maar ik weet even niet hoe je dat goed kan toepassen op jouw probleem... Waarschijnlijk moet je langs de next-as de volgende prijs opvragen en die toevoegen aan de totaalwaarde die je teruggeeft.

Rustacean

Pagina: 1