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

XML/XSL et SOAP Discussion :

Processing instruction vers XML


Sujet :

XML/XSL et SOAP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    242
    242 est déconnecté
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 14
    Par défaut Processing instruction vers XML
    Bonjour,


    Au moyen d'XSLT et de Xalan, je souhaite transformer un doc du type:
    <DOC>
    <PAG>
    <?PI s_nom="P" s_type="O"?>
    bla bla bla
    <?PI s_nom="P" s_type="C"?>
    </PAG>
    </DOC>
    Et en résultat, je veux:
    <DOC>
    <PAG>
    <P>
    bla bla bla
    </P>
    </PAG>
    </DOC>
    J'utilise donc une XSLT me générant mes balises au moyen de directives du type
    <xsl:text>&lt;P></xsl:text>........


    Mon résultat est correct sous des outils comme oxygen ou XML Spy mais Xalan me sort une exception et les traces me donnent:


    <DOC>
    <PAG>
    &lt;P&gt;
    bla bla bla
    &lt;/P&gt;
    </PAG>
    </DOC>
    Qqn aurait-il une idée?!?

    Piste: Il me semble que l'on ne peut pas utiliser les xsl:element, car, je ne sais pas à priori ou je vais poser mes balises fermantes....

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

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


    Citation Envoyé par 242
    Piste: Il me semble que l'on ne peut pas utiliser les xsl:element, car, je ne sais pas à priori ou je vais poser mes balises fermantes....
    Fausse piste, car on peut utiliser xsl:element en choisissant judicieusement les axes XPath pour sélectionner les noeuds textuels. Ca donne un truc du genre :
    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
     
    <?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:template match="*">
      <xsl:copy>
        <xsl:apply-templates select="*|processing-instruction()"/>
      </xsl:copy>
    </xsl:template>
     
    <xsl:template match="processing-instruction()[contains(., 's_type=&quot;O&quot;')]">
      <xsl:element name="{substring-before(substring-after(. ,'s_nom=&quot;'), '&quot;')}">
        <xsl:copy-of select="following-sibling::text()[generate-id(current()) = generate-id(preceding-sibling::processing-instruction()[1])]"/>
      </xsl:element>
    </xsl:template>
     
    </xsl:stylesheet>
    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
    242
    242 est déconnecté
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 14
    Par défaut
    Bonjour,

    Ca ne fonctionne pas exactement comme souhaité....

    Le problème est que l'on obtient une structure du type:
    <DOC>
    <PAG>
    <P/>
    bla bla bla

    </PAG>
    </DOC>
    j'avais mis un exemple très court pour ne pas charger, mais je vais être amené à produire de la structure pouvant ressembler à ca:
    <P>
    du contenu
    <OL>
    <LI> du contenu</LI>
    </OL>
    du contenu
    </P>
    Note: les P,OL,LI ouvrants et fermants seront posés par des Porcessing instructions



    Merci d'avance

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Citation Envoyé par 242
    Le problème est que l'on obtient une structure du type:
    Impossible. J'ai fait le test avec le XML que tu avais donné en exemple, et avec Xalan.

    Maintenant, même si le schéma est un peu plus compliqué, le principe reste le même et n'est qu'un dérivé de celui-ci : http://www.developpez.net/forums/sho...7&postcount=23
    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

  5. #5
    242
    242 est déconnecté
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 14
    Par défaut
    Bonjour,

    Cela ne fonctionne pas car non exemple etait vraiment trop simplifié et ne montrait pas un certain nombre de difficultés

    En Voici un autre un peu plus réaliste

    Il répond à un certain nombre de règles:
    - Les PI ouvrantes et fermantes ne sont pas obligatoirement dans le même PAG
    - Seuls les LIG ne peuvent contenir de PISTRUCT
    - Certaines balises ne sont pas à produire en sortie
    - Le format XML en entrée est totalement imposé

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <DOC>
    <PAG>
    <?PISTRUCT s_nom="p" s_type="O"?>
    <LIG><WD><T>Paragraphe 1 ligne 1</T></WD> </LIG>
    <LIG><WD><T>Paragraphe 1 ligne 2</T></WD></LIG>
    <?PISTRUCT s_nom="p" s_type="C"?>
    <?PISTRUCT s_nom="p" s_type="O"?>
    <?PISTRUCT s_nom="ol" s_type="O"?>
    <?PISTRUCT s_nom="li" s_type="O"?>
    <LIG> <WD><T>ol 1 ligne 1</T></WD></LIG>
    <?PISTRUCT s_nom="li" s_type="C"?>
    </PAG>
    <PAG>
    <?PISTRUCT s_nom="li" s_type="O"?>
    <LIG> <WD><T>ol 1 ligne 2</T></WD></LIG>
    <?PISTRUCT s_nom="li" s_type="C"?>
    <?PISTRUCT s_nom="ol" s_type="C"?>
    <?PISTRUCT s_nom="p" s_type="C"?>
    </PAG>
    </DOC>
    Ce qui donne en sortie:
    <DOC>

    <p>
    Paragraphe 1 ligne 1
    Paragraphe 1 ligne 2
    </p>
    <p>
    <ol>
    <li>
    ol 1 ligne 1
    </li>
    <li>
    ol 1 ligne 2
    </li>
    </ol>
    </p>

    </DOC>

  6. #6
    242
    242 est déconnecté
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 14
    Par défaut
    Bonjour,


    J'avance sur ma problématique.

    J'ai quelque chose d'un peu plus correct:
    les données d'entrée:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <DOC>
    <PAG>
    <?PISTRUCT s_nom="p" s_type="O"?>
    <LIG><WD><T>Paragraphe 1 ligne 1</T></WD> </LIG>
    <LIG><WD><T>Paragraphe 1 ligne 2</T></WD></LIG>
    <?PISTRUCT s_nom="p" s_type="C"?>
    <?PISTRUCT s_nom="p" s_type="O"?>
    <?PISTRUCT s_nom="ol" s_type="O"?>
    <?PISTRUCT s_nom="li" s_type="O"?>
    <LIG> <WD><T>ol 1 ligne 1</T></WD></LIG>
    <?PISTRUCT s_nom="li" s_type="C"?>
    </PAG>
    <PAG>
    <?PISTRUCT s_nom="li" s_type="O"?>
    <LIG> <WD><T>ol 1 ligne 2</T></WD></LIG>
    <?PISTRUCT s_nom="li" s_type="C"?>
    <?PISTRUCT s_nom="ol" s_type="C"?>
    <?PISTRUCT s_nom="p" s_type="C"?>
    </PAG>
    </DOC>
    La XSLT

    <xsl:stylesheet version="1.0" xmlnssl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="ISO-8859-1" version="1.0" />


    <xsl:template match="DOC">
    <xsl:copy>
    <xsl:apply-templates select="//processing-instruction()"/>
    </xsl:copy>
    </xsl:template>



    <xsl:template match="processing-instruction()[contains(., 's_type=&quot;O&quot;')]">
    <xsl:variable name="nomPI" select="substring-before(substring-after(. ,'s_nom=&quot;'), '&quot;')"/>
    <xsl:element name="{$nomPI}">

    <xsl:apply-templates select="following::text()[generate-id(current()) = generate-id(preceding::processing-instruction()[contains(., 's_type=&quot;O&quot;')][1])]"/>
    </xsl:element>
    </xsl:template>
    </xsl:stylesheet>
    La sortie obtenue
    <?xml version="1.0" encoding="ISO-8859-1"?><DOC><p>
    Paragraphe 1 ligne 1
    Paragraphe 1 ligne 2
    </p><p>
    </p><ol>
    </ol><li>
    ol 1 ligne 1
    </li><li>
    ol 1 ligne 2
    </li></DOC>
    Reste à régler le cas des structures imbriquées, mais pour le moment, je ne vois pas....

Discussions similaires

  1. [XML]le encoding du process instruction
    Par ep31 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 12/12/2005, 09h20
  2. Relation récursive pour exporter vers XML
    Par bossun dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/08/2005, 14h17
  3. [débutant]XML vers XML avec XSL
    Par tokamak dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 11/07/2005, 10h27
  4. XML vers XML avec XSL
    Par guizz79 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 27/06/2005, 09h43
  5. [XSLT] XML vers XML
    Par ren0 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 13/10/2004, 12h54

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