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 :

Header & un xml par fils


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 111
    Points : 56
    Points
    56
    Par défaut Header & un xml par fils
    Bonjour à tous,

    je suis relativement nouveau dans le domaine de XSL(T) et bute contre le problème suivant.

    La structure de mon document initial ressemble à ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <parent>
      <header>
        <foo>...</foo>
        <bar>...</bar>
      </header>
      <fils>
        <attr1>A</attr1>
        <attr2>...</attr2>
      </fils>
      <fils>
        <attr1>B</attr1>
        <attr2>...</attr2>
      </fils>
    </parent>
    En sortie, je dois un document XML par fils, en imbriquant chaque noeud fils (ainsi que ses fils et attributs) dans le root et en y insérant header et son contenu (attributs y compris), soit, si mon document initial contient 2 fils (il peut en contenir plusieurs centaines et chaque fils est identifiable par un ID unique):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <parent>
      <header>
        <foo>...</foo>
        <bar>...</bar>
      </header>
      <fils>
        <attr1>A</attr1>
        <attr2>...</attr2>
      </fils>
    </parent>
    Et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <parent>
      <header>
        <foo>...</foo>
        <bar>...</bar>
      </header>
      <fils>
        <attr1>B</attr1>
        <attr2>...</attr2>
      </fils>
    </parent>
    Pour la création des fichiers XML par fils, j'utilise la balise "exsl:document". J'ai tenté plusieurs approches et ne suis pas loin du résultat en utilisant le mapping suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <xsl:template match="fils">
        <exsl:document href="{./attr1}.xml" method="xml">
          <xsl:copy select="../*" >
              <xsl:copy-of select="../header" />
              <xsl:copy-of select="." /> 
          </xsl:copy>
        </exsl:document>
    </xsl:template>
    Cependant il reste (au moins) 2 problèmes:
    1) Avec la ligne 3, j'essaie de récupérer mon noeud racine (qui contient les infos de namespaces) mais malgré différents essais, j'obtiens toujours une balise "fils". Je pense que quelque chose m'échappe quand à l'exécution de la transformation et/ou aux expressions XPath.
    2) Dans le document initial, ni le header ni les fils ne contiennent les infos des namespaces (elles sont au niveau du root) mais dans la version transformée, elles sont ajoutées au niveau du header et du fils.

    Pourriez-vous m'éclairer/me mettre sur la voie afin de solutionner ces deux points?

    D'avance, un grand merci.

  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
    [0]
    de récupérer mon noeud racine (qui contient les infos de namespaces)
    Ce n'est pas un détail mineur de se passer l'info sur le namespace ancré aux fils et parent en posant la question. Il faut le préciser explicitement si vous voulez chercher des aides. C'est tellement important ici en particulièrement. Je peux donc supposer l'élément parent a un namespace par défaut attaché et fils pour cette raison hérite le même. Mais, c'est en contradition avec le template
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="fils">
    qui semble marcher malgré pas complètement de par la façàn la question est posé. C'est impossible. On peut le faire marcher comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="*[local-name()='fils']">
    Tout ça rend le narratif de la question très suspect.

    [0.1] Et pour le même raisonnement, il n'y a pas de raison que ceci pusse marcher !?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <exsl:document href="{./attr1}.xml" method="xml">
    Le même raisonnement conduit à une possible écriture ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <exsl:document href="{*[local-name()='attr1']}.xml" method="xml">
    [1]
    Cependant il reste (au moins) 2 problèmes:
    1) Avec la ligne 3, j'essaie de récupérer mon noeud racine (qui contient les infos de namespaces) mais malgré différents essais, j'obtiens toujours une balise "fils". Je pense que quelque chose m'échappe quand à l'exécution de la transformation et/ou aux expressions XPath.
    2) Dans le document initial, ni le header ni les fils ne contiennent les infos des namespaces (elles sont au niveau du root) mais dans la version transformée, elles sont ajoutées au niveau du header et du fils.
    [1.1] Pour 1), il n'y a pas de construction du genre xsl:copy avec un attribut @select. Ce n'est pas reconnu par le schéma de xslt et la fonctionnalité de @select est totalement inconnue. Pour faire ce genre de fonctionnalité, il faut passer par xsl:element à la place. (voir plus bas pour une tentative réécriture).

    [1.2] Pour 2), ce n'est pas bien compris mais j'ai dit assez sur l'origine du problème qui a un rapport avec le namespace.

    [3] Voice une réécriture qui a au moins quelque chance de conduire à quelque chose sensée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <xsl:template match="*[local-name()='fils']">
        <exsl:document href="{*[local-name()='attr1']}.xml" method="xml">
          <xsl:element name="{local-name(parent::*)}" namespace="{namespace-uri(parent::*)}">
              <xsl:copy-of select="preceding-sibling::*[local-name()='header']" />
              <xsl:copy-of select="." /> 
          </xsl:element>
        </exsl:document>
    </xsl:template>
    Essayez-le et dites-nous qu'est-ce que ça donne.

    [4] Dans un temps futur, vous voulez peut-être regarder la fonctionnalité provisionnée par xslt2 pour remplacer l'extension exsl. Mais ce n'est pas important ici par rapport de la gravité de la mal compréhension de la syntaxe de base.

  3. #3
    Membre actif
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2007
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 199
    Points : 297
    Points
    297
    Par défaut
    J'avais commencé une réponse, mais Tsuji a été plus rapide et plus complet ;-)

    La voici cependant.

    Si tu peux utiliser XSLT 2.0 (c'est pas précisé), tu peux utiliser copy-namespaces="no"

    Ca donnerait, rapidement qqchose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <xsl:template match="fils">
        <a href="{./attr1}.xml" method="xml">
        <parent>
    		  <xsl:copy-of select="../header"  copy-namespaces="no"/> 
    		  <xsl:copy-of select="."   copy-namespaces="no"/> 
    	</parent>
        </a>
    </xsl:template>
    (remplacer <a href par exsl)

    et pour résultat

    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
     
      <a href="A.xml" method="xml">
    	<parent>
    		<header>
    			<foo>...</foo>
    			<bar>...</bar>
    		</header>
    		<fils>
    			<attr1>A</attr1>
    			<attr2>...</attr2>
    		</fils>
    	</parent>
    </a><a href="B.xml" method="xml">
    	<parent>
    		<header>
    			<foo>...</foo>
    			<bar>...</bar>
    		</header>
    		<fils>
    			<attr1>B</attr1>
    			<attr2>...</attr2>
    		</fils>
    	</parent>
    </a>
    "Chuck Norris a déjà compté jusqu'à l'infini. Deux fois."

Discussions similaires

  1. [SAX] Erreur pour trouver la DTD d'un fichier XML parsé!
    Par gdawirs dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 14/01/2006, 15h28
  2. [XSD][Java]Valider un XML par rapport a un XSD
    Par sikapoch dans le forum Valider
    Réponses: 11
    Dernier message: 08/11/2005, 15h21
  3. [DOM] Erreur lors du parsing d'un fichier XML par l'API DOM
    Par patricetoan dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 26/09/2005, 12h43
  4. Réponses: 12
    Dernier message: 19/05/2005, 14h29
  5. Réponses: 3
    Dernier message: 27/01/2004, 16h15

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