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] Débutant : Oracle vers xml


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut [XSLT] Débutant : Oracle vers xml
    Tout d'abord bonjour à tous

    Une question svp pour vous les experts

    J'ai un fichier de commande avec des données d'entête et des données de ligne à générer au format xml à partir d'une vue sur plusieurs tables Oracle.

    J'ai en simplifiant avec 2 colonnes des données comme celles-ci dans cette vue :

    Commande1|Article1
    Commande2|Article1
    Commande2|Article3
    Commande3|Article1
    Commande3|Article2
    Commande3|Article3

    Le but est d'obtenir ce 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
    25
    26
    27
    28
    29
    30
     
    <FICHIER>
      <CDE>
        <ENTETE>
           <Id>Commande1</id>
        </ENTETE>
        <LIGNE>
           <Art>Article1</Art>
        </LIGNE>
      </CDE>
      <CDE>
        <ENTETE>
           <Id>Commande2</id>
        </ENTETE>
        <LIGNE>
           <Art>Article1</Art>
           <Art>Article3</Art>
        </LIGNE>
      </CDE>
      <CDE>
        <ENTETE>
           <Id>Commande3</id>
        </ENTETE>
        <LIGNE>
           <Art>Article1</Art>
           <Art>Article2</Art>
           <Art>Article3</Art>
        </LIGNE>
      </CDE>
    </FICHIER>
    J'arrive à me brancher sur l'existant (package xml pour oracle installé) pour générer un fichier XML, via une DOCXSL, contenant une commande. Dès qu'il y en a plus d'une, je lutte pour arriver à coder l'identification du changement de commande. Est-ce utile de persister dans cette voie du xsl ou je passe à l'alternative (génération du fichier xml à partir d'une programme en Pro*C).

    Merci pour vos avis

  2. #2
    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,

    avec XSL, tu peut faire cette transformation sans soucis.
    Article : Installation de Cocoon
    Je ne réponds pas aux MP à caractère technique.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Cool

    Bon j'arrive avec l'instruction preceding-sibling à ne pas répéter l'entete pour toutes les lignes, sauf que je les affiche pas (les lignes )

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Y a-t-il un pro qui pourrait coder cette instruction svp :

    Si détection nouvelle commande -> pavé entete (ça j'ai réussi à le faire, quand même )
    Pour la ligne courante afficher le pavé ligne et comparer la valeur du numéro de commande courante à celle du nœud frère s'il existe. Si identique se positionner dans le noeud frère et répéter l'instruction (Template ???). Une sorte de for each avec du following-sibling sans doute à l'intérieur ???

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Et il est où ce XML et ce XSL, parce que là on a juste le format de sortie XML désiré.

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Tu peux considérer que j'ai en sortie, avant traitement par le fichier XSL, une ligne de la vue sur table Oracle correspondant à un noeud. Je n'ai pas vraiment de fichier XML intermédiaire. Avec ce bout de code j'obtiens un début de solution mais avec uniquement une ligne de donnée de type article de traitée alors qu'il faut bien sûr toutes les afficher :

    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
    30
    31
    32
     <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:output method="xml" indent="yes" version ="1.0" omit-xml-declaration="no"></xsl:output>
      <xsl:template match="/">
        <CDE_LD>
    	   <xsl:for-each select="ROWSET/ROW">
                <xsl:choose> 
                <xsl:when test="not(NO_COMMANDE=preceding-sibling::ROW/NO_COMMANDE)">
                <COMMANDE>
                <ENTETE>
              	<NO_COMMANDE>
                    <xsl:value-of select="NO_COMMANDE"></xsl:value-of>
                </NO_COMMANDE>
                <TYPE_OPERATION>
                    <xsl:value-of select="TYPE_OPERATION"></xsl:value-of>
                </TYPE_OPERATION>
                </ENTETE>
                <LIGNE>
              <CODE_ARTICLE>
                <xsl:value-of select="CODE_ARTICLE"></xsl:value-of>
              </CODE_ARTICLE>
              <QTE_COMMANDE>
                <xsl:value-of select="QTE_COMMANDE"></xsl:value-of>
              </QTE_COMMANDE>
                </LIGNE>
                </COMMANDE>
                </xsl:when>
                </xsl:choose>
           </xsl:for-each>
        </CDE_LD>
      </xsl:template>
    </xsl:stylesheet>
    Donne :
    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
     
    <CDE_LD>
      <COMMANDE>
        <ENTETE>
          <NO_COMMANDE>00144232</NO_COMMANDE>
          <TYPE_OPERATION>A</TYPE_OPERATION>
        </ENTETE>
        <LIGNE>
          <CODE_ARTICLE>113209</CODE_ARTICLE>
          <QTE_COMMANDE>0</QTE_COMMANDE>
        </LIGNE>
      </COMMANDE>
      <COMMANDE>
        <ENTETE>
          <NO_COMMANDE>00144233</NO_COMMANDE>
          <TYPE_OPERATION>C</TYPE_OPERATION>
        </ENTETE>
        <LIGNE>
          <CODE_ARTICLE>113209</CODE_ARTICLE>
          <QTE_COMMANDE>3</QTE_COMMANDE>
        </LIGNE>
      </COMMANDE>
    </CDE_LD>

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Est-ce que je peux considérer que c'est ça ton xml de départ?
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <CDE_LD>
    	<COMMANDE>
    		<ENTETE>
    			<NO_COMMANDE>00144232</NO_COMMANDE>
    			<TYPE_OPERATION>A</TYPE_OPERATION>
    		</ENTETE>
    		<LIGNE>
    			<CODE_ARTICLE>113209</CODE_ARTICLE>
    			<QTE_COMMANDE>0</QTE_COMMANDE>
    		</LIGNE>
    		<LIGNE>
    			<CODE_ARTICLE>113219</CODE_ARTICLE>
    			<QTE_COMMANDE>1</QTE_COMMANDE>
    		</LIGNE>
    		<LIGNE>
    			<CODE_ARTICLE>113229</CODE_ARTICLE>
    			<QTE_COMMANDE>2</QTE_COMMANDE>
    		</LIGNE>
    		<LIGNE>
    			<CODE_ARTICLE>113239</CODE_ARTICLE>
    			<QTE_COMMANDE>3</QTE_COMMANDE>
    		</LIGNE>
    		<LIGNE>
    			<CODE_ARTICLE>113239</CODE_ARTICLE>
    			<QTE_COMMANDE>4</QTE_COMMANDE>
    		</LIGNE>
    	</COMMANDE>
    	<COMMANDE>
    		<ENTETE>
    			<NO_COMMANDE>00144233</NO_COMMANDE>
    			<TYPE_OPERATION>C</TYPE_OPERATION>
    		</ENTETE>
    		<LIGNE>
    			<CODE_ARTICLE>113209</CODE_ARTICLE>
    			<QTE_COMMANDE>3</QTE_COMMANDE>
    		</LIGNE>
    	</COMMANDE>
    </CDE_LD>

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci pour ton aide.
    Ce que tu affiches est tout à fait le xml que j'aimerai obtenir.
    Je pense que le xml de départ est plutôt plat, car directement issu de la table oracle, et je n'y ai pas accès. Si je reprends les données de ton exemple il ressemblerait à celui-ci :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    <ROWSET>
        <ROW>
    			<NO_COMMANDE>00144232</NO_COMMANDE>
    			<TYPE_OPERATION>A</TYPE_OPERATION>
    			<CODE_ARTICLE>113209</CODE_ARTICLE>
    			<QTE_COMMANDE>0</QTE_COMMANDE>
        </ROW>
        <ROW>
    			<NO_COMMANDE>00144232</NO_COMMANDE>
    			<TYPE_OPERATION>A</TYPE_OPERATION>
    			<CODE_ARTICLE>113219</CODE_ARTICLE>
    			<QTE_COMMANDE>1</QTE_COMMANDE>
        </ROW>
        <ROW>
    			<NO_COMMANDE>00144232</NO_COMMANDE>
    			<TYPE_OPERATION>A</TYPE_OPERATION>
    			<CODE_ARTICLE>113229</CODE_ARTICLE>
    			<QTE_COMMANDE>2</QTE_COMMANDE>
        </ROW>
        <ROW>
    			<NO_COMMANDE>00144232</NO_COMMANDE>
    			<TYPE_OPERATION>A</TYPE_OPERATION>
    			<CODE_ARTICLE>113239</CODE_ARTICLE>
    			<QTE_COMMANDE>3</QTE_COMMANDE>
        </ROW>
        <ROW>
    			<NO_COMMANDE>00144232</NO_COMMANDE>
    			<TYPE_OPERATION>A</TYPE_OPERATION>
    			<CODE_ARTICLE>113249</CODE_ARTICLE>
    			<QTE_COMMANDE>4</QTE_COMMANDE>
        </ROW>
        <ROW>
    			<NO_COMMANDE>00144233</NO_COMMANDE>
    			<TYPE_OPERATION>C</TYPE_OPERATION>
    			<CODE_ARTICLE>113209</CODE_ARTICLE>
    			<QTE_COMMANDE>3</QTE_COMMANDE>
        </ROW>
    </ROWSET>

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Ok ceci devrait fonctionner :
    En utilisant la méthode de "muench" souvent utilisé en xslt pour faire des regroupement.
    La clé de regroupement s'appelle ici 'commande' et je les définis comme étant la concaténation du numéro de la commande et le type d'opération concat(NO_COMMANDE,TYPE_OPERATION)
    Dès que l'un des 2 change, un nouveau groupe est formé.
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
     
    	<xsl:key name="commande" match="ROW" use="concat(NO_COMMANDE,TYPE_OPERATION)"/>
     
    	<xsl:template match="/ROWSET">
    		<res>
    			<xsl:for-each select="ROW">
    				<xsl:choose>
    					<xsl:when test="not(preceding-sibling::ROW) or NO_COMMANDE!=preceding-sibling::ROW[1]/NO_COMMANDE or TYPE_OPERATION!=preceding-sibling::ROW[1]/TYPE_OPERATION">
    						<xsl:copy>
    							<ENTETE>
    								<NO_COMMANDE>
    								<xsl:value-of select="NO_COMMANDE"></xsl:value-of>
    								</NO_COMMANDE>
    								<TYPE_OPERATION>
    								<xsl:value-of select="TYPE_OPERATION"></xsl:value-of>
    								</TYPE_OPERATION>
    							</ENTETE>
    							<xsl:variable name="curKey" select="concat(NO_COMMANDE,TYPE_OPERATION)"/>
    							<xsl:for-each select="key('commande',$curKey)">
    								<LIGNE>
    									<CODE_ARTICLE>
    										<xsl:value-of select="CODE_ARTICLE"></xsl:value-of>
    									</CODE_ARTICLE>
    									<QTE_COMMANDE>
    										<xsl:value-of select="QTE_COMMANDE"></xsl:value-of>
    									</QTE_COMMANDE>
    								</LIGNE>
    							</xsl:for-each>
    						</xsl:copy>
    					</xsl:when>
    				</xsl:choose>
    			</xsl:for-each>
    			<xsl:apply-templates select="key('commande',ROW[concat(NO_COMMANDE,TYPE_OPERATION)!=preceding-sibling::ROW[1]])">
     
    			</xsl:apply-templates>
    		</res>
    	</xsl:template>
    </xsl:stylesheet>

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Ecoute je te serre la main, tu me rends un grand service merci

Discussions similaires

  1. [XSLT] transformation xml vers xml
    Par nemya dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 22/02/2006, 11h02
  2. [XML][XSLT] Débutant {Probléme avec For-each-group}
    Par Silvia12 dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 29/01/2006, 21h38
  3. [xml+xslt] débutant - multiplication de nombre
    Par Silvia12 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 17/11/2005, 11h04
  4. [débutant]XML vers XML avec XSL
    Par tokamak dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 11/07/2005, 10h27
  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