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 :

Agir sur l'élément DOM en cours de construction [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut Agir sur l'élément DOM en cours de construction
    Bonjour les amis, j'ai un problème très simple ( à expliquer ) mais pour lequel la solution se fait désirer.

    J'ai 2 documents xml, un concernant le projet en cours et un étant le référentiel.

    Le fichier projet contient des id d'items et une date associée.
    Le fichier référentiels contient des arborescences du genre categorie/items.

    La présentation attendue est que les items (Nom et date associée) soit listé et groupé selon leur catégorie d'appartenance.

    Problème : si pour la catégorie x du référentiel, le fichier projet ne contient aucun Item correspondant, il faudrait cacher le div qui contient e label categorie et le tableau vide de ses items.

    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
     
    <xsl:variable name="ProceduresLookup" select="document('referentiel.xml')"/>
     
    <xsl:for-each select="$ProceduresLookup/Procedure/ItemCategory[@Id = $categoryId]/ItemCategory">
     
    	<div>
    		<table class="tgenwb">
    			<tr class="theader2">
    				<td><b><xsl:value-of select="./@Name"/></b></td>
    			</tr>
    			<tr class="theader">
    				<td>Item</td>
    				<td>Date</td>
    				<td>Description</td>
    			</tr>
    			<xsl:for-each select="./ItemType">
    				<xsl:variable name="currentItem" select="."/>
    				<xsl:for-each select="$currentDoc/Report/Session/Activity/Item">
    						<xsl:variable name="itemId" select="substring-after(./Type, '#')"/>
    					<xsl:if test="$currentItem/@Id = $itemId">
    						<tr class="tcontent" id="{$itemId}">
    						<td><xsl:value-of select="$currentItem/@Name"/></td>
    						<td><xsl:value-of select="format-dateTime(./@Date,'[D01]/[M01]/[Y0001]-[H01]:[m01]:[s01]')"/></td>
    						<td><xsl:value-of select="$currentItem/@Description"/></td>
    						</tr>
    					</xsl:if>
    				</xsl:for-each>
    			</xsl:for-each>
    		</table>
    	</div>
    </xsl:for-each>
    Je ne vois pas comment agir sur la visibité de la div courante, j'avais penser mettre pour style de la div un display:none et passer à display:inline en passant à l'intérieur de mon xsl:if mais je sais pas comment faire... javascript ou pas?

    j'ai essayé de mettre un id initialisé à position sur les div, cest ok mais lappel à la fonction JS ne marche pas, de plus le le noeud est en train d'être construit donc au final j'ai peu d'espoir de ce coté là.

    Merci de me soumettre une piste ou autre, en espérant de pas avoir été trop long ds mon explication.

  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
    Il n'y a pas de "en cours de construction."

    Pendant que XSLT s'exécute, JavaScript ne s'exécute pas. On peut toujours créer des balises <script> ou des attribut onclic="truc()" ou ce genre de choses, mais ça ne prendra pas effet avant que XSLT n'ait terminé (et que quelque chose les appelle après cela.)

    De plus, XSLT ne revient pas sur ce qu'il a déjà généré. Quand c'est fait, c'est fait, pas de modification. C'est parce qu'en réalité, ce n'est pas un langage de programmation, mais un langage de style : il déclare en quoi un élément doit être transformé. Cette transformation est atomique et définitive, elle se fait comme indiqué et on ne revient pas dessus.

    Conclusion : il n'y a pas de "en cours de construction."

    Ce que tu cherches à faire, c'est à vérifier, lorsque tu crées ton <div>, s'il doit être visible ou pas. À ce moment-là, pas plus tard. S'il l'est, bien, pas de changement. S'il ne l'est pas, autant ne pas le créer, non ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut
    merci de ta réponse, elle va déjà me faire gagner un temps précieux à ne pas chercher dans la mauvaise direction...

    mon problème est que je ne sais pas au préalable si il va y avoir des items qui vont matché au niveau de mon if dans les 2 boubles imbriquées donc je crée forcément un tableau avec ses 2 lignes d'entetes puis des données si le if match.


    je pense que je vais essayer de changer la propriété display des div sur l'événement JS onLoad() en me bassant sur le nombre d'élément ayant pour tag tr

    Le soucis cest que je ne connais pas l'id des divs concernés :
    une solution bien crade serait d'itérer de 1 à 1000 en faisant un getById et en settant l'id de la div a position() lors de sa construction dans le XSLT...

    et encore je suis pas sur que ca marche


    en tout cas pour l'idée de déterminer au préalable si la div va avoir du contenu, je vais tenter une fonction avec la meme structure et qui renvoie true si on passe dans le if et false si on arrive à la fin

    des nouvelles en milieu de matinée

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Par défaut
    au final une fonction avec la meme structure et juste un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xsl:value-of select="true">
    dans le cas ou je rentre dans le if imbriqué dans les 2 for-each

    au niveau du template d'appel ca donne ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <xsl:for-each select="$ProceduresLookup/air:Procedure/air:EventCategory[@Id = $categoryId]/air:EventCategory">
    	<xsl:if test="cs:divHaveContent(.)">
    ...
    	</xsl:if>
    </xsl:for-each>
    je devais etre fatigué hier pour partir dans mes délires de JS

    Merci en tout cas

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [UI Mobile] Pointer sur un élément DOM d'une page non chargée
    Par LaurentC33 dans le forum jQuery
    Réponses: 4
    Dernier message: 24/09/2013, 16h09
  2. Agir sur tous les éléments contenant dans 'x' dans leur id
    Par CyrilD dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 26/07/2010, 15h17
  3. [DOM] Ajouter un champ sur élément DOM créer
    Par xillibit dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 08/04/2009, 14h33
  4. Agir sur un élément d'un formulaire continu
    Par niavlys77 dans le forum IHM
    Réponses: 2
    Dernier message: 27/07/2006, 17h34
  5. [DOM] agir sur le DOM au changement d'une chaîne dans un FORM
    Par boteha dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 30/11/2005, 14h39

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