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] Récupération de données XML et namespace


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut [XSLT] Récupération de données XML et namespace
    Bonjour à tous,

    Cela fait déjà quelques jours que je suis sur un problème de XSLT. J'ai épluché pas mal de tuto, de fofo mais impossible de trouver une solution qui marche à 100%. A chaque fois, il y a un petit truc qui coince...
    Je vous explique :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <AcceptConfigurationTransmit xmlns:cdm="http://www.win.com/cdm/v2"
    	xmlns="http://www.win.com/common/configurationservice/v2" mode="ConfigAdministrative"
    	mandator="WIN" subsystem="Config">
    	<ObjectConfiguration name="INP_1"
    		uuid="12345678-0000-0000-0000-000000080001" validTo=""
    		validFrom="2009-05-01T06:00:00.000+00:02">
    		<cdm:ObjectType uuid="5010708b-679b-11de-8a39-0800200c9a66" />
    		<cdm:AttributeGroup name="Group Simulation">
    			<cdm:Attribute physicalUnit="m" type="float" value="0.0"
    				name="height" />
    			<cdm:Attribute type="int" value="1" name="nodeType" />
    		</cdm:AttributeGroup>
    	</ObjectConfiguration>
    	<ObjectConfiguration name="S1_009"
    		uuid="12345678-0000-0000-0000-000000080002" validTo=""
    		validFrom="2009-05-01T06:00:00.000+00:02">
    		<cdm:ObjectType uuid="5010708b-679b-11de-8a39-0800200c9a66" />
    		<cdm:AttributeGroup name="Group Simulation">
    			<cdm:Attribute physicalUnit="m" type="float" value="0.0"
    				name="height" />
    			<cdm:Attribute type="int" value="0" name="nodeType" />
    		</cdm:AttributeGroup>
    	</ObjectConfiguration>
    	<TopologyConfiguration released="false"
    		topologyType="Fahrweg" isTemplate="false" description="network test"
    		name="BIGNET_LIVE" uuid="12345678-1234-1234-1234-123456789012"
    		validTo="" validFrom="2009-05-01T06:00:00.000+00:02">
    		<cdm:Subsystems>
    			<cdm:Subsystem>Sim</cdm:Subsystem>
    		</cdm:Subsystems>
    		<cdm:TopologyNodes>
    			<cdm:TopologyNode yCoordinate="10000.0" xCoordinate="10000.0"
    				segmentName="" name="INP_1" uuid="12345678-5678-0000-0000-123456780001">
    				<cdm:RepresentedCDMObject uuid="12345678-aaaa-aaaa-0000-123456780001">
    					<cdm:CDMObject>12345678-0000-0000-0000-000000080001</cdm:CDMObject>
    					<cdm:Qualifier>SIMU</cdm:Qualifier>
    				</cdm:RepresentedCDMObject>
    				<cdm:DecoratingCDMObject uuid="12345678-6666-6666-6666-ddddddd80001">
    					<cdm:CDMObject>12345678-6666-6666-6666-123456780001</cdm:CDMObject>
    					<cdm:Qualifier>SIMU_InputState</cdm:Qualifier>
    					<cdm:Qualifier>SIMU_OutputState</cdm:Qualifier>
    				</cdm:DecoratingCDMObject>
    			</cdm:TopologyNode>
    		</cdm:TopologyNodes>
    	</TopologyConfiguration>
    	<TopologyConfiguration>
    .....
    	</TopologyConfiguration>
    	<KeyValueGroupConfiguration uuid="4bb0f010-cf94-11de-8a39-0800200c9a66"
    		validTo="" validFrom="2009-05-01T06:00:00.000+00:02">
    		<cdm:KeyValue type="string" value="GasCompo" key="QualityTrackingStyle"
    			validTo="" validFrom="2009-05-01T06:00:00.000+00:02" />
    	</KeyValueGroupConfiguration>
    	<KeyValueGroupConfiguration>
    ......
    	</KeyValueGroupConfiguration>
    </AcceptConfigurationTransmit>
    A partir de ce fichier XML, je cherche à créer un fichier intermédiaire qui va remodeler les infos d'une façon différente, c'est à dire 1 bloc de données XML par TopologyConfiguration, en sachant que le premier bloc de TopologyConf contiendra les infos du KeyValueGroupe.
    Mon fichier résultat devrait ressembler à ça :
    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
     
    Nombre de TopologyConfig
     
    #bloc 1:
    <AcceptConfigurationTransmit ....>
    <ObjectConfiguration1>....<ObjectConfigurationN>
    <TopologyConfiguration1>
    <KeyValueConfiguration1>....<KeyValueConfigurationN>
    </AcceptConfigurationTransmit>
     
    #bloc 2:
    <AcceptConfigurationTransmit ....>
    <ObjectConfiguration1>....<ObjectConfigurationN>
    <TopologyConfiguration2>
    </AcceptConfigurationTransmit>
     
    #bloc 3:
    <AcceptConfigurationTransmit ....>
    <ObjectConfiguration1>....<ObjectConfigurationN>
    <TopologyConfiguration3
    </AcceptConfigurationTransmit>
     
    etc...
    C'est uniquement de la copie selective de balise à différentes niveaux. Une fois le fichier généré, je le reparse pour faire 1 fichier XML / bloc de données...

    Voici mon XSL :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    <?xml version="1.0" ?>
    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
        xmlns:confserv="http://www.wintsm.com/common/configurationservice/v2"
        exclude-result-prefixes="confserv" >
     
        <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" encoding="ISO-8859-1" />
     
        <!-- To avoid empty characters -->
        <xsl:strip-space elements="*" />
     
        <xsl:template match="/">
            <!-- Get the number of TopologyConf -->
            <xsl:variable name="nbTopo"
                select="count(//confserv:TopologyConfiguration)" />
            <xsl:value-of select="$nbTopo" />
            <xsl:text>
            </xsl:text>
            <xsl:call-template name="buildXML" />
        </xsl:template>
     
        <xsl:template name="buildXML">
            <xsl:for-each select="/confserv:AcceptConfigurationTransmit/confserv:TopologyConfiguration">
     
                <!-- balise ouvrante -->
                <xsl:apply-templates select="/confserv:AcceptConfigurationTransmit"/>
                <xsl:text>
                </xsl:text>
                <xsl:apply-templates select="/confserv:AcceptConfigurationTransmit/confserv:ObjectConfiguration" />
                <xsl:text>
                </xsl:text>
                <xsl:call-template name="showTopo"/>
                <xsl:text>
                </xsl:text>
                <xsl:if test="count(preceding::confserv:TopologyConfiguration) = 0">
                    <xsl:apply-templates select="/confserv:AcceptConfigurationTransmit/confserv:KeyValueGroupConfiguration" />
               </xsl:if>
                <xsl:text>
                </xsl:text>
                <!-- balise fermante -->
               <xsl:text disable-output-escaping="yes">&lt;/AcceptConfigurationTransmit&gt;</xsl:text>
               <xsl:text>
     
               </xsl:text>
           </xsl:for-each>
           <xsl:text>
           ENDOFFILE
           </xsl:text>
        </xsl:template>
     
        <xsl:template match="/confserv:AcceptConfigurationTransmit">
        <xsl:copy>
             <xsl:copy-of select="@*" />
        </xsl:copy> 
        </xsl:template>
     
        <xsl:template match="/confserv:AcceptConfigurationTransmit/confserv:ObjectConfiguration">
            <xsl:copy-of select="." />
        </xsl:template>
     
         <xsl:template name="showTopo">    
            <xsl:copy>
                <xsl:copy-of select="@* | node()" />
            </xsl:copy>
        </xsl:template>
     
        <xsl:template match="confserv:KeyValueGroupConfiguration">
            <xsl:copy>
                <xsl:copy-of select="@* | node()" />
            </xsl:copy>
        </xsl:template>
     
    </xsl:stylesheet>
    La sortie :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    2
     
    <AcceptConfigurationTransmit xmlns="http://www.win.com/common/configurationservice/v2" xmlns:cdm=
    "http://www.win.com/cdm/v2" mode="ConfigAdministrative" mandator="win" variant="LIVE" subsystem="Config"/>
    <ObjectConfiguration xmlns="http://www.win.com/common/configurationservice/v2" xmlns:cdm=
    "http://www.win.com/cdm/v2" name="INP_1" uuid="12345678-0000-0000-0000-000000080001" validTo="" validFrom=
    "2009-05-01T06:00:00.000+00:02">
    <cdm:ObjectType uuid="5010708b-679b-11de-8a39-0800200c9a66"/>
    <cdm:AttributeGroup name="Group Simulation">
    <cdm:Attribute physicalUnit="m" type="float" value="0.0" name="height"/>
    <cdm:Attribute type="int" value="1" name="nodeType"/>
    </cdm:AttributeGroup>
    </ObjectConfiguration>
    <ObjectConfiguration xmlns="http://www.win.com/common/configurationservice/v2" xmlns:cdm=
    "http://www.win.com/cdm/v2" name="S1_009" uuid="12345678-0000-0000-0000-000000080002" validTo="" validFrom=
    "2009-05-01T06:00:00.000+00:02">
    <cdm:ObjectType uuid="5010708b-679b-11de-8a39-0800200c9a66"/>
    <cdm:AttributeGroup name="Group Simulation">
    <cdm:Attribute physicalUnit="m" type="float" value="0.0" name="height"/>
    <cdm:Attribute type="int" value="0" name="nodeType"/>
    </cdm:AttributeGroup>
    </ObjectConfiguration>
    <TopologyConfiguration xmlns="http://www.win.com/common/configurationservice/v2" xmlns:cdm=
    "http://www.win.com/cdm/v2" released="false" topologyType="Fahrweg" isTemplate="false" description="network test" 
    name="BIGNET_LIVE" uuid="12345678-1234-1234-1234-123456789012" validTo="" validFrom="2009-05-01T06:00:00.000+00:02">
    <cdm:Subsystems>
    <cdm:Subsystem>Sim</cdm:Subsystem>
    </cdm:Subsystems>
    <cdm:TopologyNodes>
    <cdm:TopologyNode yCoordinate="10000.0" xCoordinate="10000.0" segmentName="" name="INP_1" uuid=
    "12345678-5678-0000-0000-123456780001">
    <cdm:RepresentedCDMObject uuid="12345678-aaaa-aaaa-0000-123456780001">
    <cdm:CDMObject>12345678-0000-0000-0000-000000080001
    					</cdm:CDMObject>
    <cdm:Qualifier>SIMU</cdm:Qualifier>
    </cdm:RepresentedCDMObject>
    </cdm:TopologyNode>
    </cdm:TopologyNodes>
    </TopologyConfiguration>
    <KeyValueGroupConfiguration xmlns="http://www.win.com/common/configurationservice/v2" xmlns:cdm=
    "http://www.win.com/cdm/v2" uuid="12345678-1234-1234-1234-123456789040" validTo="" validFrom=
    "2009-05-01T06:00:00.000+00:02">
    <cdm:KeyValue type="string" value="Yes" key="GasQualityTracking" validTo="" validFrom="2009-05-01T06:00:00.000+00:02"/>
    <cdm:KeyValue type="string" value="Off" key="HeatDynamics" validTo="" validFrom="2009-05-01T06:00:00.000+00:02"/>
    </KeyValueGroupConfiguration>
    <KeyValueGroupConfiguration xmlns="http://www.win.com/common/configurationservice/v2" xmlns:cdm=
    "http://www.win.com/cdm/v2" uuid="1506cc10-cf94-11de-8a39-0800200c9a66" validTo="" validFrom=
    "2009-05-01T06:00:00.000+00:02">
    <cdm:KeyValue type="float" value="51.0" key="BasicPressure" validTo="" validFrom="2009-05-01T06:00:00.000+00:02"/>
    <cdm:KeyValue type="string" value="3" key="SettingNormalCond" validTo="" validFrom="2009-05-01T06:00:00.000+00:02"/>
    </KeyValueGroupConfiguration>
    <KeyValueGroupConfiguration xmlns="http://www.win.com/common/configurationservice/v2" xmlns:cdm=
    "http://www.win.com/cdm/v2" uuid="4bb0f010-cf94-11de-8a39-0800200c9a66" validTo="" validFrom=
    "2009-05-01T06:00:00.000+00:02">
    <cdm:KeyValue type="string" value="GasCompo" key="QualityTrackingStyle" validTo="" validFrom=
    "2009-05-01T06:00:00.000+00:02"/>
    </KeyValueGroupConfiguration>
    </AcceptConfigurationTransmit>
     
           ENDOFFILE
    J'ai les bonnes balises dans le bon ordre, par contre :
    j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <AcceptConfigurationTransmit xmlns="http://www.win.com/common/configurationservice/v2" xmlns:cdm=
    "http://www.win.com/cdm/v2" mode="ConfigAdministrative" mandator="win" variant="LIVE" subsystem="Config"/>
    <ObjectConfiguration xmlns="http://www.win.com/common/configurationservice/v2" xmlns:cdm=
    "http://www.win.com/cdm/v2" name="INP_1" uuid="12345678-0000-0000-0000-000000080001" validTo="" validFrom=
    "2009-05-01T06:00:00.000+00:02">
    Alors que je voudrais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <AcceptConfigurationTransmit xmlns:cdm="http://www.wintsm.com/cdm/v2"
    	xmlns="http://www.wintsm.com/common/configurationservice/v2" mode="ConfigAdministrative" mandator="win" variant="LIVE" subsystem="Config">
    <ObjectConfiguration name="INP_1" uuid="12345678-0000-0000-0000-000000080001" validTo="" validFrom=
    "2009-05-01T06:00:00.000+00:02">
    - Le xmlns n'est pas dans le bon ordre dans la 1ère balise
    - la 1ère balise se termine par subsystem="Config"/> au lieu de subsystem="Config">
    - les namespaces apparaîssent dans la 2ième balise alors qu'il ne devrait pas...

    Pourtant, j'ai mis le exclude-result-prefixes, mais il n'a pas l'air de vouloir marcher. Je dois certainement me tromper entre : @*, *, ., node()...

    Pourriez vous m'aider s'il vous plaît ??
    D'avance, merci pour votre aide.
    Nico alias Dread38

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 563
    Points : 21 627
    Points
    21 627
    Par défaut
    Non mais on ne traite pas du XML comme ça.

    On ne peut pas mettre un chiffre perdu comme ça au début. On ne peut pas mettre du texte perdu comme ça à la fin. Une balise ne se ferme pas en écrivant un </fin-balise>, elle se ferme en indiquant qu'on ferme la balise.

    Cette méthode ne marchera pas, oublie-la. Lis des tutoriels XML et comprends ses règles. Lis des tutoriels XSLT et fais comme eux. Tu n'as pas trouvé "d'astuce dont ils parlent pas," tu as eu une idée qui ne marche pas. Il faut l'oublier, et faire les choses comme il est prévu qu'elles soient faites.


    Ton exemple étant bien trop verbeux et inutilement compliqué pour exposer le problème, je ne peux pas te donner la solution qui me viendrait à l'esprit.
    Mais une chose est sûre, n'essaie pas d'écrire une fin de balise, ou de garder une balise ouverte artificiellement. Ça ne marchera pas.
    Par ailleurs, les <xsl:text> vides, c'est comme s'ils n'étaient pas là.

Discussions similaires

  1. Récupération de donnée XML dans un DataGrid
    Par zenadrith dans le forum Flex
    Réponses: 0
    Dernier message: 03/06/2010, 11h03
  2. Récupération des données XML
    Par Mickael33 dans le forum XQUERY/SGBD
    Réponses: 2
    Dernier message: 02/08/2009, 10h33
  3. [SimpleXML] récupération de données xml
    Par pyrenaut dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 19/08/2008, 14h08
  4. [XSLT] Versioning de données XML
    Par emorele dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 17/03/2008, 17h54
  5. [SimpleXML] Récupération des données XML
    Par squalito dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 30/05/2006, 14h22

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