IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

Afficher le résultat d'une requête sql dans une page html avec Saxon


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 8
    Points : 9
    Points
    9
    Par défaut Afficher le résultat d'une requête sql dans une page html avec Saxon
    Bonjour,

    Je souhaite faire un select dans ma base mysql et afficher le résultat dans une page html générée par un fichier php chargé de transformer la feuille de style ci-dessous.
    J'arrive à me connecter et je pense que la syntaxe de mes requêtes est correcte mais je ne sais pas comment afficher les résultats.
    J'ai essayé avec un <xsl:value-of select="$nom_variable" mais ça ne marche pas.

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"  
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:sql="java:/net.sf.saxon.sql.SQLElementFactory" 
    xmlns:saxon="http://saxon.sf.net/" 
    >
    <xsl:output method="html" encoding="UTF-8"/>
     
    <xsl:variable name="connection" as="java:java.sql.Connection" xmlns:java="http://saxon.sf.net/java-type">
    	<sql:connect driver="mysql51.perso" database="toto" user="toto" password="passpass"/>
    </xsl:variable>
     
    <xsl:template match="films">
     
    	<xsl:for-each select="film">
     
    		<xsl:variable name="xmlidallocine" select="@id"/>
     
    		<!-- je définis mes 2 requêtes -->
    		<xsl:variable name="url_catid">
    			<sql:query connection="$connection" table="films" column="catid" where = "id ='{$xmlidallocine}'" />
    		</xsl:variable>
     
    		<xsl:variable name="url_id">
    			<sql:query connection="$connection" table="films" column="id"    where = "id ='{$xmlidallocine}'" />
    		</xsl:variable>
     
    		<!--  je veux afficher les résultats de la requête -->
    		<xsl:value-of select="$url_id" /> 
    		<xsl:value-of select="$url_catid" /> 
     
    	</xsl:for-each>
     
    </xsl:template>
     
    <sql:close connection="$connection"/>
     
     
    </xsl:stylesheet>

    Avec <xsl:value-of select="count($url_id) />, j'obtiens le nombre 1 donc ma connexion à la base ne semble pas être le problème, je voudrais juste qu'à la placer de compter, ça m'affiche le résultat.

    Merci pour votre aide

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    je voudrais juste qu'à la placer de compter, ça m'affiche le résultat.
    Je ne suis pas sûr que je comprends le souci...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <xsl:template match="/">
        <html>
        <head><title></title></head>
        <body>
        <table style="border:1px solid black;border-collapse:collapse;">
            <!-- pas sûr si "films" est le nom de la racine -->
            <xsl:apply-templates select="films" />
        </table>
        </body>
        </html>
    </xsl:template>
    <xsl:template match="films">
        <xsl:for-each select="film">
            <tr>
            <xsl:variable name="xmlidallocine" select="@id"/>
            <!-- je définis mes 2 requêtes -->
            <xsl:variable name="url_catid">
                <sql:query connection="$connection" table="films" column="catid" where = "id ='{$xmlidallocine}'" />
            </xsl:variable>
            <xsl:variable name="url_id">
                <sql:query connection="$connection" table="films" column="id"    where = "id ='{$xmlidallocine}'" />
            </xsl:variable>
     
            <!--  je veux afficher les résultats de la requête -->
            <td style="border:1px solid black"><xsl:value-of select="$url_id" /></td>
            <td style="border:1px solid black"><xsl:value-of select="$url_catid" /></td>
            </tr>
        </xsl:for-each>
    </xsl:template>
    Est-ce que c'est proche de ce que vous pensez et souhaitez de résulter?

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Ce que je dis est peut-être con, mais il me semble que tu as oublié extension-element-prefixes.
    Et donc que Saxon ne se serait jamais douté que ces éléments sont censés faire du SQL. Pour lui ce sont des éléments normaux que tu crées normalement et qui ne font rien d'autre qu'exister.
    D'où le décompte de un : <sql:query> est exactement un élément. Et vu qu'il ne contient que des attributs et pas de texte, <xsl:value-of> dessus n'affiche juste rien.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Merci pour vos réponses.
    Effectivement, la requête sql ne se fait pas.
    Il semble que dans ma découverte enthousiaste du xslt, j'ai oublié le petit détail d'installer Saxon sur mon serveur.

    J'imaginais naïvement que ce n'était pas utile. Comme j'ai un hébergement mutualisé, qu'il semble impossible de l'installer dessus et qu'il est hors de question de passer sur un serveur dédié pour l'instant, je dois oublier Saxon, Xalan et autres.

    Y aurait-t-il un autre moyen de faire une requête sql avec xslt sans passer par un processeur nécessitant une installation ?


    Je vous donne le code complet. Toute la transformation de ma feuille s'effectue parfaitement, sauf cette requête sql qui ne passe pas !

    Merci !
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    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="UTF-8"?>
     
    <xsl:stylesheet version="1.0"
    	xmlns:sql="java:/net.sf.saxon.sql.SQLElementFactory"
     	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    	xmlns:saxon="http://saxon.sf.net/"
     	extension-element-prefixes="saxon sql">
     
    <xsl:output method="html" encoding="UTF-8"/>
    <xsl:key name="regrouper" match="film" use="@titre"/>
     
    <xsl:variable name="connection" as="java:java.lang.Object" xmlns:java="http://saxon.sf.net/java-type">   
    	<sql:connect driver="mysql51.perso" database="nom_base" user="user_name" password="pass"  />
    </xsl:variable>
     
    <xsl:template match="films">
    	<ul>
    		<xsl:for-each select="film[generate-id(.)=generate-id(key('regrouper', @titre)[1])]">
    			<xsl:variable name="xmlidallocine" select="@id"/>
     
    			<xsl:variable name="url_id">
    				<sql:query connection="$connection" table="films" column="id" where = "id ='$xmlidallocine'" />				
    			</xsl:variable>
    			<xsl:variable name="url_catid">
    				<sql:query connection="$connection" table="films" column="catid" where = "id ='$xmlidallocine'" />
    			</xsl:variable>
    		<li> 
    			<a>
                             <!-- C'est dans ce lien que je veux afficher les résultats de ma requête-->   
    				<xsl:attribute name = "href">
    					index.php?option=com_flexicontent&amp;view=items&amp;cid=<xsl:value-of select = "$url_catid" />&amp;id=<xsl:value-of select = "$url_id" />
    				</xsl:attribute>
    				<img>
    					<xsl:attribute name="src">
    						<xsl:value-of select="@affichette"/>
    					</xsl:attribute>							
    					<xsl:attribute name="alt">
    						<xsl:value-of select="@titre" />
    					</xsl:attribute>		
    				</img>
    			</a>
    		</li>
    		</xsl:for-each>
    </ul>
    </xsl:template>
     
    <sql:close connection="$connection"/>
     
    </xsl:stylesheet>

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    J'ai trouvé une solution beaucoup plus simple en passant par une fonction php qui figure dans le fichier php et qui est appelée dans le fichier xslt.
    Enfin pas si simple, étant novice, ça m'a pris du temps à résoudre quelques bugs.
    Le fichier php :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <?php
    # LOAD XML FILE
    $XML = new DOMDocument();
    $XML->load( 'doc.xml' );
     
    # START XSLT
    $xslt = new XSLTProcessor();
     
    # IMPORT STYLESHEET
    $XSL = new DOMDocument();
    $XSL->load( 'http://www.monsite/films.xsl');
    $xslt->registerPHPFunctions();
    $xslt->importStylesheet( $XSL );
     
     
    // LIEN FICHE FILM
    function getUrlLink($idallocine)
    { 
    $db =& JFactory::getDBO();
    $idcontent= "SELECT id, catid, idallocine FROM  #__content   WHERE idallocine =".$idallocine;
    $db->setQuery($idcontent);
    $urls = $db->loadObjectList();			
    if ($urls) 
    	{
    	foreach($urls as $url) 
    		{
    		$lien="index.php?option=com_flexicontent&view=items&cid=".$url->catid."&id=".$url->id;
    		}
    	}	
    return $lien;
    }    
     
    // On modifie le format des horaires
    function formatHoraire($horaire)
    { 
    $horaire =  str_replace ( " | ", ", ", $horaire);
    $horaireclean =  str_replace ("|", " | ", $horaire);
    return $horaireclean;
    }
     
    # On affiche la transformation
    $films = $xslt->transformToXML( $XML ); 
    echo '<ul style="width:100%;display:inline;">';
    echo $films;
    echo '</ul>';
    ?>

    Attention à ajouter la mention $xslt->registerPHPFunctions();

    Le fichier xslt
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <?xml version="1.0" encoding="UTF-8"?>
    
    <xsl:stylesheet version="1.0"
     	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     	 xmlns:php="http://php.net/xsl"
    	exclude-result-prefixes="php"
    >
    
    <xsl:output method="html" encoding="UTF-8" omit-xml-declaration="yes"/>
    <xsl:key name="regrouper" match="film" use="@titre"/>
    
    
    <xsl:template match="films">
    
    	<xsl:for-each select="film[generate-id(.)=generate-id(key('regrouper', @titre)[1])]">
    	<xsl:variable name="xmlidallocine" select="@id"/>
    		<li> 
    		<xsl:attribute name="style">
    			<xsl:text>display:inline;margin-left:15px;</xsl:text>
    		</xsl:attribute>
    					<xsl:for-each select="//horaire_web[../@titre=current()/@titre]">
    						<xsl:text>Séances </xsl:text>
    						<xsl:if test="@projection = '3D'">
    							<xsl:value-of select="@projection" /> 
    						</xsl:if> 
    						<xsl:text> : </xsl:text> <xsl:value-of disable-output-escaping="yes" select="php:functionString('formatHoraire', //horaire_web)"/><xsl:text><![CDATA[<br >]]></xsl:text>
    					</xsl:for-each>
    				</xsl:attribute>		
    
    				<a>
    					<xsl:attribute name = "href">
    						<xsl:value-of disable-output-escaping="yes" select="php:functionString('getUrlLink', @id)"/>
    					</xsl:attribute>
    					<img>
    						<xsl:attribute name="src">
    							<xsl:choose>
    								<xsl:when test="@affichette != ''">
    									<xsl:value-of select="@affichette"/>
    								</xsl:when>
    								<xsl:otherwise>
    									<xsl:value-of select="images/vignette_defaut.jpg"/>
    								</xsl:otherwise>
    							</xsl:choose>		
    						</xsl:attribute>							
    						<xsl:attribute name="alt">
    							<xsl:value-of select="@titre" />
    						</xsl:attribute>		
    					</img>
    				</a>
    		</li>
    </xsl:for-each>
    </xsl:template>
    </xsl:stylesheet>]

    Là ne pas oublier :
    - la mention disable-output-escaping="yes" au niveau du select
    - préciser dans mon cas "php:functionString" et pas juste "php:function"
    - veiller au préfixe dans l'en-tête : xmlns:php...
    et dans l'output : omit-xml-declaration="yes"


    Le fichier xml
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <ProgrammationSalles>
    <semaine date="xx/xx/xxxx">
    	<salles>
    	<salle id="xx" nom="xx" ville="x" adresse="x" metro="">
    		<films>
    			<film id="198460" titre="À coeur ouvert" titreoriginal="A Coeur ouvert" realisateurs="Marion Laine" acteurs="Juliette Binoche, Edgar Ramírez" anneeproduction="2012" datesortie="08/08/2012" duree="5220" genreprincipal="Comédie dramatique" nationalite="" synopsis="Mila et Javier sont tous deux chirurgiens du coeur. Mariés depuis dix ans, ils ont deux passions : leur amour et leur métier. Mais Mila tombe enceinte, contre toute attente, et la perspective d'un enfant remet en cause l'équilibre de leur relation." poids="113" affichette="http://images.allocine.fr/r_120_160/b_1_cfd7e1/medias/nmedia/18/91/04/29/20159853.jpg" video="19363779" urlResa="">
    				<horaire_web vo="0" version="Français" projection="numérique" soustitre=""  salle="    ">Mer, Sam : 18:30|Jeu : 21:00|Ven : 16:30|Mar : 20:30</horaire_web>
    			</film>
    			<film id="135528" titre="Rebelle" titreoriginal="Brave" realisateurs="Mark Andrews, Brenda Chapman, Brenda Chapman" acteurs="Billy Connolly, Emma Thompson, Julie Walters, John Ratzenberger, Reese Witherspoon" anneeproduction="2012" datesortie="01/08/2012" duree="5700" genreprincipal="Animation" nationalite="américain" synopsis="Merida, la fille du roi Fergus est bien décidée à suivre son propre chemin dans la vie. Elle défie une tradition millénaire sacrée aux yeux de trois seigneurs du royaume, et sans l'avoir voulu, elle va déchaîner le chaos dans le royaume." poids="764" affichette="http://images.allocine.fr/r_120_160/b_1_cfd7e1/medias/nmedia/18/84/94/35/20186091.jpg" video="19376194" urlResa="">
    				<horaire_web vo="0" version="Français" projection="numérique" soustitre=""  salle="    ">Mer, Ven, Sam : 14:30|Dim : 10:30 | 14:30</horaire_web>
    			</film>
    			<film id="135528" titre="Rebelle" titreoriginal="Brave" realisateurs="Mark Andrews, Brenda Chapman, Brenda Chapman" acteurs="Billy Connolly, Emma Thompson, Julie Walters, John Ratzenberger, Reese Witherspoon" anneeproduction="2012" datesortie="01/08/2012" duree="5700" genreprincipal="Animation" nationalite="américain" synopsis="Merida, la fille du roi Fergus est bien décidée à suivre son propre chemin dans la vie. Elle défie une tradition millénaire sacrée aux yeux de trois seigneurs du royaume, et sans l'avoir voulu, elle va déchaîner le chaos dans le royaume." poids="764" affichette="http://images.allocine.fr/r_120_160/b_1_cfd7e1/medias/nmedia/18/84/94/35/20186091.jpg" video="19376194" urlResa="">
    				<horaire_web vo="0" version="Français" projection="3D" soustitre=""  salle="    ">Jeu, Mar : 14:30</horaire_web>
    			</film>
    		</films>
    	</salle>
    	</salles>
    </semaine>
    </ProgrammationSalles>

    J'espère que ça aidera certains qui débutent comme moi

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Je pense effectivement que ça peut servir à ceux et celles qui font du XSLT avec PHP.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 371
    Points
    2 371
    Par défaut
    Bonjour,

    oui, c'est intéressant, un truc original.

    Et, n'ayant pas fait de Php depuis longtemps, je me demandais :
    * si Php a intégrée Xalan (ou un autre analyseur, dont je suis curieux de connaitre le nom),
    * si ta a eu besoin d'installer une librairie spéciale pour supporter Saxon (quoique j'imagine que cela ne puisse être possible en mutualisé)
    * quelqu'un sait-il si on peut utiliser le script Php avec Xalan ?


    Merci pour vos précisions.
    Article : Installation de Cocoon
    Je ne réponds pas aux MP à caractère technique.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/05/2015, 10h19
  2. Réponses: 1
    Dernier message: 12/12/2011, 10h07
  3. erreur dans une requête sql dans une fonction php
    Par frboyer dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2009, 13h37
  4. Réponses: 13
    Dernier message: 26/07/2007, 08h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo