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 :

[XSLT]L'équivalent XSL de isset (php)


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 57
    Points : 37
    Points
    37
    Par défaut [XSLT]L'équivalent XSL de isset (php)
    Bonjour,

    Voilà, je vais essayé d'être clair.
    J'utilise des feuilles de style XSLT générées par MapForce, en entrée, on a des fichiers XML correspondant à un schéma précis qui est notre format standard et reflètent nos tables SQL.
    Pour générer nos fichiers de sorties transformés en un format désiré, on passe donc par ces feuilles de style.

    Suivant nos requêtes, chaque table ne retourne pas une ligne, notre fichier XML avant transformation peut avoir ces 3 têtes là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <table1>
        <colonne1>ABC</colonne1>
        <colonne2>123</colonne2>
    </table1>
    <table2>
        <colonne1>titi</colonne1>
        <colonne2>toto</colonne2>
    </table2>
    OU

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <table1>
        <colonne1>ABC</colonne1>
        <colonne2>123</colonne2>
    </table1>
    OU

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <table2>
        <colonne1>titi</colonne1>
        <colonne2>toto</colonne2>
    </table2>
    Or, j'ai un template qui fait un contrôle entre les colonnes 1 de chaque table. Donc quant les 2 tables sont représentées dans le fichier XML, ça va, mais dans les 2 autres cas, impossible d'avoir quelque chose en sortie.
    Ce template doit permettre de s'assurer d'avoir une donnée récurrente et indispensable (colonne 1 dans chaque table) en sortie (si dans table 1, je prends cette donnée, sinon, si pas de représentation de la table 1 dans le fichier XML, je prends celle de la table 2).

    Voici mon template :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	<xsl:template name="recurrentDataRestitution">
    		<xsl:param name="data1" select="."/>
    		<xsl:param name="data2" select="."/>		
    		<xsl:choose>
    			<xsl:when test="$data1">
    				<xsl:value-of select="$data1"/>
    			</xsl:when>
    			<xsl:otherwise>			
    				<xsl:value-of select="$data2"/>			
    			</xsl:otherwise>		
    		</xsl:choose>
    	</xsl:template>
    Donc dans le cas où la table 1 n'est pas représentée, data1 n'est pas valorisée et mon template ne fonctionne plus.
    J'ai donc pensé à un test de la valorisation de data1 comme on peut le faire avec ISSET en php, mais je ne sais pas si c'est possible.
    Si vous avez la solution ou des idées, je suis suepr preneur, là, je craque.

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    là, j'ai un peu de mal à me figurer la chose (ça doit être la fatigue de la fin de journée ), donc ça m'aiderait si tu montrais ce que tu veux obtenir en sortie de ta transformation.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 57
    Points : 37
    Points
    37
    Par défaut
    Alors en gros.

    En entrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <caractéristiques>
         <code valeur>FR32</code valeur>
         <libellé>TEST</libellé>
         <pays>france</pays>
    </caractéristiques>
    <prix>
         <code valeur>FR32</code valeur>
         <prix1>1.23</prix1>
         <prix2>1.56</prix2>
    </prix>
    En sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <description valeur>
          <code>FR32</code>
          <titre>TEST</titre>
          <lieu>france</lieu>
          <prix HT>1.23</prix HT>
          <prix TTC>1.56</prix TTC>
    </description valeur>
    Mais si je n'ai pas d'info prix par exemple (donc un fichier XML en entrée avec <caractéristiques>......</caractéristiques> seulement); je dois avoir en sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <description valeur>
          <code>FR32</code>
          <titre/>
          <lieu/>
          <prix HT>1.23</prix HT>
          <prix TTC>1.56</prix TTC>
    </description valeur>
    Le template agit donc sur le 'code valeur' (en entrée) pour donner le 'code', on a donc 2 entrées pour une seule sortie.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 57
    Points : 37
    Points
    37
    Par défaut
    Je crois que j'ai trouvé.
    En fait, mapforce passe au crible chaque élément, puis applique tel ou tel template si besoin.
    Et dans mon cas, s'il trouve la donnée 'code valeur' dans <caractéristiques>, il va chercher la donnée 'code valeur' dans <prix> pour appliquer le template, sauf que cette donnée, il ne la trouve jamais car elle n'existe pas....

    Bon, je pense que c'est ça, du coup, je ne vois pas du tout comment faire....hormis changer l'appli en C++ qui génère le fichier XML en entrée et le forcer a créer la partie <prix>.

    Si vous avez une idée pour éviter ça, ça serait vraiment génial...

  5. #5
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    La clé primaire porte le même nom pour toutes les tables (soit <code-valeur>) ?
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 57
    Points : 37
    Points
    37
    Par défaut
    Oui, toujours le même nom

  7. #7
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Une solution possible serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <xsl:key name="codes" match="code-valeur" use="."/>
    ...
    <xsl:for-each select="//code-valeur[generate-id(.) = generate-id(key('codes', .)[1])]">
      <description>
        <code><xsl:value-of select="."/></code>
        <titre><xsl:value-of select="key('codes', .)/following-sibling::libellé"/></titre>
        <lieu><xsl:value-of select="key('codes', .)/following-sibling::pays"/></lieu>
        <titre><xsl:value-of select="key('codes', .)/following-sibling::libellé"/></titre>
        <prixHT><xsl:value-of select="key('codes', .)/following-sibling::prix1"/></prixHT>
        ...
      </description>
    <xsl:for-each>
    Dans le for-each, on fait une intération sur chaque occurrence de code différent (en d'autres termes, un regroupement). On pose le postulat que les noeuds code-valeur sont les premiers de chaque table, et que les autres noeuds sont ses fréres (d'où l'utilisation de following-sibling).
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

Discussions similaires

  1. [XSLT 1.0] PHP/XSLT et la fonction *xsl:include*
    Par khand dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 14/02/2011, 12h00
  2. [XSLT] Des variables entre XSL et PHP
    Par mabedan dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 17/08/2007, 16h17
  3. Réponses: 1
    Dernier message: 04/04/2005, 16h16
  4. equivalence du isset() php en asp
    Par jecht dans le forum ASP
    Réponses: 4
    Dernier message: 13/05/2004, 14h48
  5. Transformation xml + xsl -> HTML via PHP
    Par petit-ourson dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 19/10/2003, 22h42

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