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 :

Probléme et optimisation XSLT


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 7
    Par défaut Probléme et optimisation XSLT
    Bonjour à tous,

    Voila je viens a vous car j'ai un souci concernant l’écriture d'une feuille xslt.

    J'ai un fichier xml contenant les données que je dois formater selon un format bien précis et produire un fichier texte.


    Voila un extrait du fichier de donnée:

    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
     
    <cim:Plant rdf:about="____centraleproduction_2">
    	<Plant.sInstTotale>0.0</Plant.sInstTotale>
    	<Plant.sRaccB>0.0</Plant.sRaccB>
    	<Plant.qRacc>0.0</Plant.qRacc>
    	<Plant.type>photovoltaique</Plant.type>
    	<cim:PowerSystemResource.Location rdf:resource="____siteproduction_2"/>
    	<cim:EquipmentContainer.Equipments rdf:resource="____protectiondecouplage_2"/>
    	<Plant.stockage>true</Plant.stockage>
    	<Plant.sRaccC>0.0</Plant.sRaccC>
    	<Plant.sRacc>0.0</Plant.sRacc>
    	<cim:EquipmentContainer.Equipments rdf:resource="____batteriecondensateurs_2"/>
    	<Plant.pRacc>0.0</Plant.pRacc>
    	<Plant.qMin>0.0</Plant.qMin>
    	<cim:IdentifiedObject.name>CENTRALE PV</cim:IdentifiedObject.name>
    	<Plant.qMax>0.0</Plant.qMax>
    	<Plant.raccordement>triphase</Plant.raccordement>
    	<Plant.pInstTotale>0.0</Plant.pInstTotale>
    	<Plant.sRaccA>0.0</Plant.sRaccA>
    	<cim:EquipmentContainer.Equipments rdf:resource="____troncon_2"/>
    	<Plant.eProduiteMoyAnnuelle>0.0</Plant.eProduiteMoyAnnuelle>
    	<Plant.Season rdf:resource="____saison"/>
    	<cim:IdentifiedObject.mRID>__centraleproduction_2</cim:IdentifiedObject.mRID>
    </cim:Plant>
     
    <cim:ACLineSegment rdf:about="____troncon_2">  
    	<cim:PowerSystemResource.AssetDataSheet rdf:resource="____modeletroncon"/>
    	<ACLineSegment.type>raccordement</ACLineSegment.type>
    	<cim:ACLineSegment.x>0.2</cim:ACLineSegment.x>
    	<cim:ACLineSegment.r>0.1</cim:ACLineSegment.r>
    	<cim:IdentifiedObject.aliasName/>
    	<cim:IdentifiedObject.name/>
    	<cim:IdentifiedObject.mRID>__troncon_2</cim:IdentifiedObject.mRID>
    </cim:ACLineSegment>
     
     
    <cim:Switch rdf:about="____protectiondecouplage_2">
    	<cim:PowerSystemResource.AssetDataSheet rdf:resource="____modeleprotectiondecouplage"/>
    	<cim:IdentifiedObject.mRID>__protectiondecouplage_2</cim:IdentifiedObject.mRID>
    </cim:Switch>
    Chaques balises (Switch, Plant, ACLineSegment) représentent des objets ainsi que leurs attributs après génération depuis un modèle UML.

    Il peut exister une relation entre l'objet Plant et/ou ACLinSegment,Switch par le biais de l'attribut "cim:EquipmentContainer.Equipments" de l’élément Plant.

    Dans mon fichier texte final, je dois afficher certaines infos de l’élément Plant et dire si par exemple il est relié avec un switch :

    L’élément <cim:EquipmentContainer.Equipments rdf:resource="____protectiondecouplage_2"/> trouve une correspondance avec l'element <cim:Switch rdf:about="____protectiondecouplage_2"> en effet l'attribut rdf:resource match parfaitement avec l'attribut rdf:about (____troncon_2 = ____troncon_2) !

    J'ai fait une moulinette qui permet de faire ça mais c'est vraiment de la bidouille, j'aimerai savoir s'il existe un moyen plus propre de faire ça ?

    Voici mon code:

    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
     
    <xsl:template match="cim:Plant">
    <!--Pour chaque Equipment de Plant, on verifie si c'est une protection de découplage-->
    	<xsl:variable name="organeCoupureTest">
    		<xsl:for-each select="cim:EquipmentContainer.Equipments">
    			<xsl:variable name="ressource" select="@rdf:resource"/>
    			<xsl:for-each select="//cim:Switch">
    					<xsl:if test="$ressource = @rdf:about">1</xsl:if>
    			</xsl:for-each>	
    		</xsl:for-each>
    	</xsl:variable>
     
    	<xsl:variable name="origProd" select="0"/>
    	<xsl:variable name="organeCoupure" select="if ($organeCoupureTest = '1') then 'Prod' else 'Noeud' "/>
    	<xsl:variable name="sPuissanceNom" select="if (Plant.sRacc[node()]) then Plant.sRacc else '-' "/>
    	<xsl:variable name="puissanceActive" select="if (Plant.sRacc[node()]) then Plant.sRacc else '-' "/>
    	<xsl:variable name="puissanceReactiveMax" select="if (Plant.qMax[node()]) then Plant.qMax else '-' "/>
    	<xsl:variable name="puissanceReactiveMin" select="if (Plant.qMin[node()]) then Plant.qMin else '-' "/>
    	<xsl:variable name="puissanceReactiveProd" select="if (Plant.qRacc[node()]) then Plant.qRacc else '-' "/>
     
    <xsl:value-of select="concat($id,$SautDeLigne,$organeCoupure,$virg,$origProd,$virg,$sPuissanceNom,$virg,$puissanceActive,$virg,$puissanceReactiveMax,$virg,$puissanceReactiveMin,$virg,$puissanceReactiveProd,$SautDeLigne)"/>
    </xsl:template>
    Le for-each imbriqué ne me plait pas du tout et puis le fait de mettre la variable à 1 quand une correspondance est trouvée puis de tester cette variable pour afficher la bonne string dans le fichier texte c'est pas top !

    Voila si quelqu'un peut m'aider à optimiser ça je lui en serai reconnaissant !

    Merci à vous

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if( cim:EquipmentContainer.Equipments/@rdf:resource = //cim:Switch/@rdf:about ) then ...
    Signifie :

    - Prendre d'un côté A les attributs rdf:resource de tous mes enfants cim:EquipmentContainer.Equipments
    - Prendre d'un autre côté B les attributs rdf:about de tous les éléments cim:Switch du document
    - Vérifier s'il existe un attribut de A qui soit égal à un attribut de B
    - Si oui, alors...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 7
    Par défaut
    Effectivement ^^ je suis un boulet !
    A croire que j'aime me compliquer la vie ....

    Merci thelvin !!!!!

    Enfin j'ai un autre souci, comment puis-je afficher le nom (cim:IdentifiedObject.name) de tout les éléments ACLineSegment dont le rdf:about match avec le rdf:ressource du cim:EquipmentContainer.Equipments ?

    Car j'ai essayé pas mal de choses dérivées du bout de code que tu m'as donné mais je ne print rien ou alors pas comme je voudrais .

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Mon bout de code repose uniquement sur une expression XPath.

    Si tu veux afficher des choses, il va falloir passer par du XSLT, XPath ne suffit pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <xsl:for-each select="//cim:Switch[@rdf:about = current()/cim:EquipmentContainer.Equipments/@rdf:resource]">
     
      <!--
        Parcourt tous les cim:Switch du document qui ont un rdf:about
        égal à un rdf:resouce d'un des cim:EquipmentContainer.Equipments
        du nœud en cours.
        Tu en fais ce que tu veux.
       -->
     
    </xsl:for-each>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 7
    Par défaut
    Merci thelvin ça m'a bien débloqué ton coup de pouce !!

    En fait j'étais pas très loin de ta solution mais du coup je viens d'apprendre la différence entre "." et current().

    Merci beaucoup pour ton aide.

    Cordialement...

  6. #6
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 7
    Par défaut
    Bonjour tout le monde !

    Voila j'ai un autre petit souci. je dois afficher une liste filtrée des noms de certaines "AsynchronousMachine" qui doivent être séparées par une virgule, le cas classique !

    Le problème c'est que la solution de tester la position du nœud ne peut fonctionner ici puisque les "AsynchronousMachine" est filtré et position() renvoie 1 pour chaque élément "AsynchronousMachine" !

    Auriez vous une solution à ce prolème?
    Pourquoi current()/position() renvoie toujours 1 alors que si j'affiche les positions dans un template qui match les noeuds AsynchronousMachine j'ai bien les positions 1 et 2 ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <!--Machines asynchrone-->
    <xsl:for-each select="/rdf:RDF/node()[contains(name(),'GeneratingUnit') and cim:GeneratingUnit.Plant/@rdf:resource = current()/@rdf:about]">
    		<xsl:for-each select="//cim:AsynchronousMachine[cim:AsynchronousMachine.GeneratingUnit/@rdf:resource = current()/@rdf:about]">
    			<xsl:value-of select="concat(current()/cim:IdentifiedObject.name, ' - ' , current()/position())"/>
    		</xsl:for-each>
    	</xsl:for-each>

    Cordialement.

Discussions similaires

  1. algo problème d'optimisation (trajet)
    Par gugumon dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 22/06/2006, 17h35
  2. Réponses: 9
    Dernier message: 27/04/2006, 15h02
  3. problème xml et xslt
    Par yassinchaouki dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 24/04/2006, 09h03
  4. Problème d'optimisation
    Par jozes dans le forum Langage
    Réponses: 8
    Dernier message: 15/02/2006, 15h41
  5. Recherche de pistes pour un problème d'optimisation
    Par TiKeuj dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 15/08/2005, 15h50

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