login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[PHP/XML/XSL] Alle XML data uit een XML-bestand wordt getoond (Opgelost)

Offline graviton - 08/03/2009 02:36 (laatste wijziging 08/03/2009 02:37)
Avatar van gravitonNieuw lid Ik heb een XML-bestand waarin data mbt een aantal productgroepen staat, zoals DVD's en games. Op dit XML-bestand pas ik XSL-templates toe door aan de server-side met behulp van PHP de standaard PHP XSL-processor toe te passen. Zie code:


  1. <?php
  2.  
  3. $xslDoc = new DOMDocument();
  4. $xslDoc->load("XSLbestand.xsl");
  5.  
  6. $xmlDoc = new DOMDocument();
  7. $xmlDoc->load("XMLbestand.xml");
  8.  
  9. $proc = new XSLTProcessor();
  10. $proc->importStylesheet($xslDoc);
  11. echo $proc->transformToXML($xmlDoc);
  12.  
  13. ?>


Nu werkt dit allemaal goed op 1 ding na. Alle data uit het XML bestand wordt nu getoond op het scherm.
Ik wil juist alleen bepaalde data op het scherm tonen welke zich tussen bepaalde XML-tags bevindt.
De bedoeling is bijvoorbeeld dat op een bepaalde pagina op de website alleen data mbt de DVD's wordt getoond, dus alleen producten welke tussen de <DVD> en </DVD> tags staan. Wat er nu gebeurt is dat alle data uit het XML bestand wordt getoond, ook alles dat tussen <GAMES> tags staat en dat is juist niet de bedoeling.

Ik weet dus alleen niet hoe ik dat moet doen met XSL (of PHP). (De XSL styling moet dus wel blijven werken op de gekozen data uit het XML-bestand.)

Iemand kwam met de volgende suggestie: "Onderdruk de XML elementen die je niet ge-output wil zien met een nieuwe lege XSL template".
  1. <xsl:template match="specifiekElement"></xsl:template>


Het bovenstaande lijkt me alleen handig in zeer specifieke gevallen, maar niet in mijn geval, want op de ene pagina wil ik een bepaald element wel tonen en op een andere pagina niet. Als ik een element permanent zou onderdrukken op de bovenstaande manier, dan heb ik die flexibiliteit namelijk niet om het XML element te tonen wanneer ik wil.

Een PHP oplossing zoals het volgende zou het ook kunnen laten werken, alleen is het volgende stukje code mijn eigen verzinsel en werkt het niet:
  1. <?php
  2. //Echo alleen alles tussen de DVD-tags
  3. echo $proc->transformToXML($xmlDoc->root[0]->dvd);
  4.  
  5. //Het bovenstaande stukje code geeft de volgende error:
  6. //Warning: XSLTProcessor::transformToXml() expects parameter 1 to be object, null given
  7. ?>


Een andere oplossing is een X-Path expressie loslaten op het geladen XML bestand, echter de x-path functie werkt alleen op een SimpleXML object vermoed ik.

2 antwoorden

Gesponsorde links
Offline marten - 08/03/2009 10:18
Avatar van marten Beheerder http://devzone....eb-Content

Dat is een artikel daarover. Ze behandelen onder andere dat je het document als string terug kan krijgen. Wanneer je het als string hebt kan je makkelijk een xml document ervan maken en dan door middel van simpleXML de data uitlezen die je wilt.
Offline graviton - 08/03/2009 22:46 (laatste wijziging 09/03/2009 21:05)
Avatar van graviton Nieuw lid Het is gelukt, ik heb een oplossing gevonden. De oplossing was het doorgeven van een parameter mbv PHP naar het XSL bestand.

PHP:
  1. <?php
  2. $xslDoc = new DOMDocument();
  3. $xslDoc->load("XSLbestand.xsl");
  4.  
  5. $xmlDoc = new DOMDocument();
  6. $xmlDoc->load("XMLbestand.xml");
  7.  
  8. $proc = new XSLTProcessor();
  9. $proc->importStylesheet($xslDoc);
  10.  
  11. //Hier pass ik een GET variabele uit de url naar het XSL bestand
  12. $proc->setParameter(null, 'product', $_GET['product']);
  13.  
  14. echo $proc->transformToXML($xmlDoc);
  15. ?>


Ook in het XSL bestand definieer ik een "product" parameter. Afhankelijk van de waarde van de parameter kies ik doormiddel van choose en when statements met xpath de juiste range aan elementen en pas op die range de templates toe.

XSL:
  1. <xsl:param name="product" />
  2.  
  3.  
  4. <xsl:template match="/">
  5. <xsl:choose>
  6. <xsl:when test="$product = 'dvd'">
  7. <xsl:for-each select="/root/dvd">
  8. <xsl:apply-templates/>
  9. </xsl:for-each>
  10. </xsl:when>
  11. <xsl:when test="$product = 'games'">
  12. <xsl:for-each select="/root/games">
  13. <xsl:apply-templates/>
  14. </xsl:for-each>
  15. </xsl:when>
  16. </xsl:choose>
  17. </xsl:template>
  18.  
  19. <xsl:template match="/dvdElement">
  20. <!-- Hier worden de dvd elementen gestyled -->
  21. </xsl:template>
  22.  
  23. <xsl:template match="/gamesElement">
  24. <!-- Hier worden de games elementen gestyled -->
  25. </xsl:template>
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.196s