Bonjour à tous,

Je suis nouveau sur Alsacréation (que j'ai longtemps lu Alsace création Smiley smile et j'espère que vous pourrez m'aider.

Admettons que j'ai le lien suivant qui affiche une page: www.exemple.com/livre.php?id=47

j'ai ensuite le fichier XML suivant: livres.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="livres.xsl"?>
<bibliothèque>
 <livre>
  <id>46</id>
  <titre>texte...</titre>
  <résumé>texte...</résumé>
  <auteur>texte...</auteur>
 </livre>
 <livre>
  <id>47</id>
  <titre>texte...</titre>
  <résumé>texte...</résumé>
  <auteur>texte...</auteur>
 </livre>
 <livre>
  <id>48</id>
  <titre>texte...</titre>
  <résumé>texte...</résumé>
  <auteur>texte...</auteur>
 </livre>
</bibliothèque>


Ainsi que le fichier xsl suivant: livres.xsl

<?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 id="playlist" cellspacing="0">
      <tbody>
        <tr class="title">
          <td colspan="2"><h3>Spécifications:</h3></td>
        </tr>
        <xsl:for-each select="bibliothèque/livres">
              <tr class="odd">
                <td><xsl:value-of select="titre"/> </td>
                <td><xsl:value-of select="résumé"/> </td>
              </tr>
        </xsl:for-each>
      </tbody>
    </table>
  </xsl:template>
</xsl:stylesheet>


Et pour finir le fichier PHP suivant qui m'affiche la page:

<?php
$xml = new DomDocument;
$xml->load("xml/livres.xml");

$xsl = new DomDocument;
$xsl->load("xml/livres.xsl");

$xslt = new Xsltprocessor;
$xslt->importStylesheet($xsl);

$transformation = $xslt->transformToXml($xml);
echo $transformation;

?>


Ce que j'aimerai c'est que le xsl me cherche dans le XML seulement le livre correspondant à l'ID du lien. autrement dit: www.exemple.com/livre.php?id=47

Es ce possible?

Merci de votre aide
Modifié par Sp4tz (06 Nov 2008 - 15:47)
Modérateur
Salut, Smiley smile

C'est possible oui en passant le paramètre à l'aide de la méthode setParameter et en récupérant ce paramètre dans la feuille xsl à l'aide de xsl:param.

Cela donne :

index.xml
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="index.xsl"?>
<bibliothèque>
   <livre>
      <id>46</id>
      <titre>titre 46</titre>
      <résumé>résumé 46</résumé>
      <auteur>auteur 46</auteur>
   </livre>
   <livre>
      <id>47</id>
      <titre>titre 47</titre>
      <résumé>résumé 47</résumé>
      <auteur>auteur 47</auteur>
   </livre>
   <livre>
      <id>48</id>
      <titre>titre 48</titre>
      <résumé>résumé 48</résumé>
      <auteur>auteur 48</auteur>
   </livre>
</bibliothèque>

index.xsl
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

   <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

   <xsl:param name="tri"/>

   <xsl:template match="/">
      <table id="playlist">
         <caption>Spécifications:</caption>
         <xsl:for-each select="bibliothèque/livre[./id = $tri]">
            <tr>
               <td><xsl:value-of select="titre"/></td>
               <td><xsl:value-of select="résumé"/></td>
               <td><xsl:value-of select="auteur"/></td>
            </tr>
         </xsl:for-each>
      </table>
   </xsl:template>

</xsl:stylesheet>

index.php
<?php

final class Page {

   final private function parse($xml, $xsl, $param) {

      $DomXml = DOMDocument::load($xml)
      or die('Le fichier xml est indisponible ou comporte des erreurs !');

      $DomXsl = DOMDocument::load($xsl)
      or die('Le fichier xsl est indisponible ou comporte des erreurs !');

      $process = new XSLTProcessor;
      $process->importStyleSheet($DomXsl);
      foreach($param as $key => $value) $process->setParameter("", $key, htmlspecialchars($value));

      return print $process->transformToXML($DomXml);

   }

   final public function __construct($xml, $xsl, $param) {

      header('Content-type: text/html; charset=utf-8');
      ob_start('ob_gzhandler');

      return is_string($xml) && is_string($xsl) && is_array($param) ?
         Page::parse($xml, $xsl, $param):
         false;

   }

}

$xml = 'index.xml';
$xsl = 'index.xsl';
$param = array('tri' => '47');

new Page($xml, $xsl, $param);

?>

Modifié par koala64 (02 Jun 2008 - 10:23)
Un GRAND MERCI à toi, Koala64! Ca fonctionne du "feu de dieu" Smiley biggrin

J'ai juste modifié un truc pour que cela me prenne l'ID du lien...


...
$xid = $_GET['id'];
$param = array('tri' => $xid);
...


Merci et félicitation pour votre site.

Sp4tz
Re bonjour...

Suite à ta réponse qui fonctionne parfaitement en PHP version 5, je me demandais si il y a moyen de la modifier pour qu'elle fonctionne sur PHP 4?