[XML/XSLT] vraag

Pagina: 1
Acties:

  • bladeoner911
  • Registratie: Maart 2005
  • Laatst online: 07-01-2022
Als ik bijvoorbeeld de volgende elementen in mijn XSLT file gebruik.
code:
1
2
3
4
<xsl:variable name="Producten" select="document('Producten.xml')"/>

<td><xsl:value-of select="$Producten/Producten/Product/Product_ID"/></td>
<td><xsl:value-of select="$Producten/Producten/Product/Product_Naam"/></td>

en de xml file is ongeveer zo opgebouwd:
code:
1
2
3
4
5
6
7
8
9
10
<Producten>
    <Product>
    <Product_ID>1</Product_ID>
    <Product_Naam>blaa</Product_Naam>
    </Product>
     <Product>
    <Product_ID>2</Product_ID>
    <Product_Naam>blaaaaa</Product_Naam>
    </Product>
</Producten>

Dan wordt als deze data in een html tabel wordt getoond alleen de 1e Product_ID en Product_Naam gebruikt en dan wordt deze in alle bij de records gezet. Dat ziet er ongeveer zo uit:

Product_ID Product_Naam
1 blaa
1 blaa

Weet iemand wat ik precies fout doe en hoe ik dit kan oplossen?

[ Voor 16% gewijzigd door bladeoner911 op 05-04-2005 15:59 ]


Verwijderd

Er nog een xsl:for-each loopje omheen zetten?

  • bladeoner911
  • Registratie: Maart 2005
  • Laatst online: 07-01-2022
Hoe kan ik dat precies doen?

Verwijderd

Het is volgens mij de bedoeling van dit forum om mensen te helpen, niet om mensen precies uit te leggen - ook wel voorkauwen genoemd - hoe iets moet gebeuren. Maarreh, hier is een (erg oud) voorbeeld:
http://annevankesteren.nl...ample_1/landbouwbedrijven

  • bladeoner911
  • Registratie: Maart 2005
  • Laatst online: 07-01-2022
Ik heb geprobeerd om nog een xsl:for each loopje eromheen te maar dan wordt de data niet netjes in de tabel weergegeven. Het gaat er bij mijn voorbeeld om: producten.xml dat is een 2e xml bestand die aangeroepen wordt in een xsl stylesheet.

  • bladeoner911
  • Registratie: Maart 2005
  • Laatst online: 07-01-2022
Hetgeen waar ik mee bezig ben zijn 2 xml files die in een html tabel getoond worden door middel van een xsl file. De 1e xml file wordt netjes getoond in de html tabel en de 2e xml file wordt wel geladen in de tabel maar dan wordt alleen de 1e record gepakt. Dat ziet er ongeveer zo uit:

Klant_ID Klant_Naam Product_ID Product_Naam
1 Naam1 1 Product1
2 Naam2 1 Product1
3 Naam3 1 Product1

Ik heb al een aantal dingen geprobeerd te veranderen zoals die for each loop toevoegen en dergelijke maar dan wordt of de data niet goed weergegeven, bijvoorbeeld dan worden alle producten in 1 record gestopt of de data wordt gewoon helemaal niet weergegeven.

  • samo
  • Registratie: Juni 2003
  • Laatst online: 21:38

samo

yo/wassup

Het geen dat jij probeert wordt hier uitgelegd:
http://www.w3schools.com/xsl/xsl_for_each.asp

je moet dus:
code:
1
2
3
4
5
<table>
 <xsl:for-each value="product">
  <tr><td>enz</td></tr>
 </xsl:fir-each>
</table>

[ Voor 22% gewijzigd door samo op 05-04-2005 12:18 ]

Bekend van cmns.nl | ArneCoomans.nl | Het kindertehuis van mijn pa in Ghana


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Verwijderd schreef op maandag 04 april 2005 @ 16:11:
Er nog een xsl:for-each loopje omheen zetten?
xsl:for-each gebruiken voor dingen die in XSL meer dan 1 keer moeten worden uitgevoerd is net zoiets als tabellen gebruiken voor opmaak in HTML ;). Het kan wel, maar het kan beter zo: (sorry voor het voorkauwen ;))

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
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:template match="/">
        <xsl:apply-templates select="document('Producten.xml')/Producten"/> 
    </xsl:template>
    
    <xsl:template match="Producten">
        <table>
            <tr>
                <th>id</th>
                <th>naam</th>
            </tr>
            <xsl:apply-templates select="Product" />
        </table>
    </xsl:template>
        
    <xsl:template match="Product">
        <tr>
            <td><xsl:value-of select="Product_ID"/></td>
            <td><xsl:value-of select="Product_Naam"/></td>
        </tr>
    </xsl:template> 

</xsl:stylesheet>

[ Voor 76% gewijzigd door Genoil op 05-04-2005 12:27 . Reden: iets mooier nog ]


  • bladeoner911
  • Registratie: Maart 2005
  • Laatst online: 07-01-2022
Maar Genoil op de manier hoe je de xsl stylesheet hebt opgebouwd kan je op diezelfde manier ook 2 of meer xml files meer aanroepen?

  • bladeoner911
  • Registratie: Maart 2005
  • Laatst online: 07-01-2022
samo-arne schreef op dinsdag 05 april 2005 @ 12:18:
Het geen dat jij probeert wordt hier uitgelegd:
http://www.w3schools.com/xsl/xsl_for_each.asp

je moet dus:
code:
1
2
3
4
5
<table>
 <xsl:for-each value="product">
  <tr><td>enz</td></tr>
 </xsl:fir-each>
</table>
Op die site heb ik al meerdere malen gekeken, zo kreeg ik het wel voor elkaar om 1 xml file aan te roepen maar geen 2e.

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
bladeoner911 schreef op dinsdag 05 april 2005 @ 12:33:
Maar Genoil op de manier hoe je de xsl stylesheet hebt opgebouwd kan je op diezelfde manier ook 2 of meer xml files meer aanroepen?
Je bedoelt dat je meerdere xml files met Producten wilt inlezen in 1 XSL file? Ja dat kan, maar dat heeft an sich niet zoveel te maken met het alternatief voor for-each dat ik liet zien.

Het voorbeeld dat ik liet zien laadt slechts 1 Producten.xml in, maar wel in een proces dat 'foo.xml' transformeert mbv producten.xsl.

foo.xml:
code:
1
2
<?xml version="1.0" encoding="iso-8859-1"?>
<foo />

  • bladeoner911
  • Registratie: Maart 2005
  • Laatst online: 07-01-2022
Maar kan je door middel van een XSL file ook zorgen dat er data uit 2 XML files wordt gelezen en dat deze dan netjes in 1 HTML tabel wordt getoond. Als we even teruggaan naar de site die samo-arne in beeld liet komen namelijk: http://www.w3schools.com/xsl/xsl_for_each.asp daar is te zien een kolom met: Title en een kolom met Artist. De data die onder deze kolommen staat komt uit 1 XML file is het ook mogelijk om bijvoorbeeld een XML file die Title heet te hebben met de data die onder Title staat en een XML file met Artist met de data onder Artist en deze dan door middel van XSL samen te voegen zodat je hetzelfde resultaat krijgt als op die site maar dan met meerdere XML files???

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
ja dan krijg je bijvoorbeeld zoiets:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:template match="/">
        <table>
            <tr>
                <th>id</th>
                <th>naam</th>
            </tr>
            <xsl:apply-templates select="document('producten1.xml')/Producten/Product"/> 
            <xsl:apply-templates select="document('producten2.xml')/Producten/Product"/> 
        </table>
    </xsl:template>
            
    <xsl:template match="Product">
        <tr>
            <td><xsl:value-of select="Product_ID"/></td>
            <td><xsl:value-of select="Product_Naam"/></td>
        </tr>
    </xsl:template> 

</xsl:stylesheet>

  • bladeoner911
  • Registratie: Maart 2005
  • Laatst online: 07-01-2022
Is het ook mogelijk om 2 verschillende files te laden in de XSL sheet bijvoorbeeld: Klanten.xml en Producten.xml en deze naast elkaar in een HTML tabel te laden.
Dat zal er dan ongeveer zo uit zien:

Klant_ID Klant_Naam Product_ID Product_Naam
1 Naam1 1 Product1
2 Naam2 2 Product2
3 Naam3 3 Product3

[ Voor 50% gewijzigd door bladeoner911 op 05-04-2005 14:54 ]


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Ja dat is natuurlijk ook mogelijk, maar dan wordt het al wel weer een stukje lastiger. Gaat me een beetje te ver om dat ook allemaal voor te kauwen ;).

Waarin ligt de relatie tussen product en klant besloten? Werk je echt met losse XML files, of komen klanten en producten toevallig uit een relationele database? In dat geval lijkt het me beter om 1 XML file te genereren waarbinnen de relatie tussen klanten en producten (op hierarchische wijze) aangegeven wordt, ipv van met losse files te werken waarvan de elementen verwijzen naar elementen in een andere file.

  • bladeoner911
  • Registratie: Maart 2005
  • Laatst online: 07-01-2022
In mijn voorbeeld krijg ik voor elkaar dat je de data ziet maar dan onder elkaar. Wat ik probeer is om de Klant data in de kolom ernaast te krijgen. Het ziet er ongeveer zo uit:

Product_ID Product_Naam Klant_ID Klant_Naam
1 Product1
2 Product2
3 Product3
1 Naam1
2 Naam2
3 Naam3

Is het ook mogelijk om de data in de kolom ernaast te krijgen????

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
post es een stukje klanten.xml dan, anders kan ik niet eens een tip of hint geven :)

  • bladeoner911
  • Registratie: Maart 2005
  • Laatst online: 07-01-2022
Genoil schreef op dinsdag 05 april 2005 @ 15:26:
Ja dat is natuurlijk ook mogelijk, maar dan wordt het al wel weer een stukje lastiger. Gaat me een beetje te ver om dat ook allemaal voor te kauwen ;).

Waarin ligt de relatie tussen product en klant besloten? Werk je echt met losse XML files, of komen klanten en producten toevallig uit een relationele database? In dat geval lijkt het me beter om 1 XML file te genereren waarbinnen de relatie tussen klanten en producten (op hierarchische wijze) aangegeven wordt, ipv van met losse files te werken waarvan de elementen verwijzen naar elementen in een andere file.
Je hoeft natuurlijk niet alles voor te kauwen, als je me maar een btje in de goede richting kan sturen. ;) Ik werk in ieder geval echt met losse XML files. Het gaat er hierbij om dat als je Klanten.xml opent dat er een HTML tabel wordt opgebouwd die een stukje gevuld wordt met data uit Klanten.xml en een stukje uit Producten.xml. Dat gebeurd als volgt:
- Je opent Klanten.xml daarin is de volgende regel verwerkt:
code:
1
<?xml-stylesheet type="text/xsl" href="Test.xsl"?>

- In de XSL sheet wordt de tabel aangemaakt en Producten.xml wordt aangeroepen waardoor de data in de tabel geladen kan worden.
En dan wordt deze HTML tabel gevuld weergegeven.

Het enige probleem is nog dat ik de data niet naast elkaar krijg.
Nu is het wel gelukt om de data naast elkaar te krijgen, maar dan wordt van het 2e xml file wat hij moet laden alleen het 1e element in de records geplaats. Dus als je bijvoorbeeld 3 producten dan hebt dan geeft ie het 1e product 3 maal aan.

  • bladeoner911
  • Registratie: Maart 2005
  • Laatst online: 07-01-2022
Genoil schreef op dinsdag 05 april 2005 @ 15:33:
post es een stukje klanten.xml dan, anders kan ik niet eens een tip of hint geven :)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="Klanten.xsl"?>
<Klanten>
    <Klant>
    <Klant_ID>1</Klant_ID>
    <Klant_Naam>Fred Boomgaard</Klant_Naam>
    </Klant>
    <Klant>
    <Klant_ID>2</Klant_ID>
    <Klant_Naam>Henk Jansen</Klant_Naam>
    </Klant>
     <Klant>
    <Klant_ID>3</Klant_ID>
    <Klant_Naam>Bas Pietersen</Klant_Naam>
    </Klant>
</Klanten>


Note: dit is niet de volledige Klanten.xml onder de 3e klant volgen nog een aantal namen maar deze zijn hetzelfde opgebouwd. Dit is ook maar een voorbeeld. ;)

Genoil in ieder geval al bedankt dat je me een beetje op weg hebt geholpen met het veranderen van die structuur.

[ Voor 49% gewijzigd door bladeoner911 op 05-04-2005 15:44 ]


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Maar hoe weet je nou welke klant welke producten heeft? Dan verwacht op z'n minst iets als dit:

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"?>
<?xml-stylesheet type="text/xsl" href="Klanten.xsl"?>
<Klanten>
    <Klant>
      <Klant_ID>1</Klant_ID>
      <Klant_Naam>Fred Boomgaard</Klant_Naam>
      <Product_ID>1</Product_ID>
      <Product_ID>5</Product_ID>
    </Klant>
    <Klant>
      <Klant_ID>2</Klant_ID>
      <Klant_Naam>Henk Jansen</Klant_Naam>
      <Product_ID>1</Product_ID>
      <Product_ID>2</Product_ID>
      <Product_ID>4</Product_ID>
    </Klant>
     <Klant>
      <Klant_ID>3</Klant_ID>
      <Klant_Naam>Bas Pietersen</Klant_Naam>
      <Product_ID>3</Product_ID>
      <Product_ID>4</Product_ID>
    </Klant>
</Klanten>


of andersom, dat je verwijzigingen maakt vanuit producten naar de klanten die ze hebben. Hangt er vanaf waarop je de tabel wilt sorteren. In jouw voorbeeld lijk je te willen sorteren op Product, dus kun je beter in producten.xml verwijzen naar de klanten die ze hebben...

  • bladeoner911
  • Registratie: Maart 2005
  • Laatst online: 07-01-2022
Dat klopt niet helemaal inderdaad daar heb je gelijk in, maar het gaat meer om de output. Het gaat erom dat 2 verschillende XML files worden gecombineert tot 1 HTML tabel. En dat dit goed wordt weergegeven.

[ Voor 11% gewijzigd door bladeoner911 op 05-04-2005 15:56 ]


  • bladeoner911
  • Registratie: Maart 2005
  • Laatst online: 07-01-2022
Alleen de data van de 2e XML file die aangeroepen wordt dien ik nog in de juiste kolom te krijgen.

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Nou je hebt mazzel dat ik vandaag een beetje zit te wachten op een Klant die maar geen uitsluitsel geeft over hoe hij z'n Product precies wil hebben ;).

Je komt er iig niet zonder dat je in de ene file referenties maakt naar de andere. Ik heb nu even klanten bij de producten gezet (itt m'n vorige reply):

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" encoding="iso-8859-1"?>
<Producten>
    <Product>
        <Product_ID>1</Product_ID>
        <Product_Naam>Product A</Product_Naam>
        <Klant_ID>1</Klant_ID>
        <Klant_ID>2</Klant_ID>
    </Product>
    <Product>
        <Product_ID>2</Product_ID>
        <Product_Naam>Product B</Product_Naam>
        <Klant_ID>3</Klant_ID>
    </Product>
    <Product>
        <Product_ID>3</Product_ID>
        <Product_Naam>Product C</Product_Naam>
        <Klant_ID>1</Klant_ID>
        <Klant_ID>2</Klant_ID>
        <Klant_ID>3</Klant_ID>
    </Product>
</Producten>


Je hebt in je tabel nu 1 rij per Klant_ID nodig om alle info te laten zien in tabelvorm (regel 14 -> 18). Voor het gemak dubbel ik daarom maar even de product info per klant dat het product heeft (r 21/22), anders wordt het nog weer pittiger. Klanten.xml wordt als globale variabele ingelezen (r 4). Het enige lastige is nou nog de Klant_Naam te achterhalen via het id (regel 24):
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
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:variable name="klanten" select="document('klanten.xml')/Klanten" />
    
    <xsl:template match="/">
        <table border="1">
            <tr>
                <th>product id</th>
                <th>product naam</th>
                <th>klant id</th>
                <th>klant naam</th>
            </tr>
            <xsl:apply-templates select="//Klant_ID" />
        </table>
    </xsl:template>
            
    <xsl:template match="Klant_ID">
        <tr>
            <xsl:variable name="klantId" select="." />
            <td><xsl:value-of select="../Product_ID" /></td>
            <td><xsl:value-of select="../Product_Naam" /></td>
            <td><xsl:value-of select="$klantId" /></td>
            <td><xsl:value-of select="$klanten//Klant_ID[text() = $klantId]/../Klant_Naam" /></td>
        </tr>
    </xsl:template>
    
</xsl:stylesheet>


Note: Deze XSL transformeert dus Producten.xml ipv Klanten.xml wat jij doet. Dit omdat in dit voorbeeld vanuit Producten naar Klanten gerefereerd wordt. Kan ook andersom, tis immers een m:n relatie die zich toch altijd op twee manieren naar het meer XML vriendelijke 1:n vertaald.

[ Voor 174% gewijzigd door Genoil op 05-04-2005 16:59 ]


  • bladeoner911
  • Registratie: Maart 2005
  • Laatst online: 07-01-2022
Genoil hartstikke bedankt ik denk dat ik er zo wel uit kom.
Pagina: 1