Index/Sommaire hiérarchique XML-XSL [RESOLU] - XML/XSL - Programmation
Marsh Posté le 08-03-2009 à 10:25:58
J'avance,
J'ai reussi à supprimer les doublons pour le premier niveau de mon Index/Sommaire:
Mais j'arrive pas àcrée mon niveau 2
Mon XML:
Code :
|
Mon XSL:
Code :
|
Mon message d'erreur
Code :
|
Merci d'avance de m'orienter
Marsh Posté le 08-03-2009 à 11:26:56
JojoSs75 a écrit :
|
J'ai réussi à effacer le messager d'erreur comme ceci:
Code :
|
C’était juste un oubli de guillemet.
Par contre le niveau 2 n’apparaît pas ?!?
Etant débutant, je pense que ne vois pas quelle fonction me pourrait être utile, et que le code pourrait être allégé...
Merci de votre aide.
Marsh Posté le 08-03-2009 à 13:31:54
En général en xslt on utilise très peu les for-each, les if et les call-template...
L'idée c'est plutôt de spécialiser des templates (et de jouer avec les modes)
Bref c'est pas trop ce que toi tu fais, à savoir :
- définissons un template qui match le père
- si tel test, alors call template A qui traite le fils
- sinon call template B qui traite le fils autrement
C'est plutôt :
- template qui match fils dont le père vérifie truc
- template qui match fils dont le père ne vérifie pas le truc
À coup de apply-templates on se déplace naturellement dans l'arbre XML. call-template c'est plutôt pour appeler un template nommé faisant un traitement sur autre chose que l'arbre XML (genre formatter une string, calculer un truc...)
Marsh Posté le 08-03-2009 à 15:03:45
Xavier_OM a écrit : |
Bonjour Xavier_OM,
merci pour ta reponse, si je te comprend bien je devrais d'abort trier tous les fils et trier par peres! c'est bien ça?
La ou je bloc c'est comment trier les fils en fonction des peres?
As tu une piste STP?
Pouras t'on incrementer autant de fils que l'on veux?
Merci d'avance...
Marsh Posté le 08-03-2009 à 18:47:39
Je sais pas trop ce que tu veux, mais je dis que la bonne façon de faire du xslt c'est en écrivant :
<xsl:template match='Sommaire[Pere = "Racine"]/My'>
ou
<xsl:template match='My[parent::Sommaire[Pere = "Racine"]'>
pour 'matcher' les balises My des blocks ayant "Racine" comme Pere
Et pas call-template + if blablabla
Marsh Posté le 08-03-2009 à 21:39:28
En faite ce que je veux crée est un index automatique avec hiérarchisation.
Mon veux est que cette index ce génère tous seul suivant les données de la BDD, c'est pour ca que j'ai crée deux balises "My" et "Pere".
Mot (Pere : Racine / My : mot)
Bv (Pere : Racine / My : BV )
Auto (Pere : BV / My : Auto)
Meca (Pere : BV / My : Meca )
Fiche (Pere : Meca / My : Fiche)
Calcul (Pere : Meca / My : Calcul)
Mag (Pere : Racine / My : mag)
La première boucle prend comme référence "racine" de la balise "Pere"
La deuxième boucle prend comme référence la balise "Pere" qui et la même que la balise "My" de la boucle précédente et ainsi de suite...
Je ne sais pas si c'est claire... Pour ca j'ai t'es redessinée mon arborescence avec a coté des balises un icone pour te situer le passage du "Pere" qui recherche la valeur de la balise "My" pour ce coller dessous avec un léger décalage.
Là ou je risque d'avoir un problème c'est de limité les doublons. Car j'aurais plusieurs fois le même block.
Merci
Marsh Posté le 09-03-2009 à 10:42:57
Rapidement ton truc je commencerai comme ça moi :
Code :
|
Ça transforme cet XML :
Code :
|
en :
0 Definition |
Chaque ligne sur l'output commence par un nombre qui est le degré d'indentation du truc (0 espaces, 4 espaces, 8 espaces...)
Bref faut lire :
|
Un autre truc pas tout à fait trivial qui pourra te servir (ou pas) : generate-id()
Je te mets un bout de code :
Xml :
Code :
|
Résultat :
Pour obtenir ça on doit faire un parcours en largeur de l'arbre au lieu d'un classique parcours en profondeur, pour d'abord extraire les entetes de colonnes (uniques) puis ce qu'on va mettre dessous à chaque ligne.
Xslt :
Code :
|
Cette technique se nomme "muenchian method", c'est une façon de contourner une limitation de xslt 1.1 quand on veut trouver l'union de plusieurs éléments (l'équivalent unix d'un grep "balise" | sort | uniq)
http://www.jenitennison.com/xslt/g [...] chian.html
Marsh Posté le 09-03-2009 à 20:48:46
Xavier_OM a écrit : |
Oulàlà....
Vas me falloir du temps pour tous comprendre...
Merci beaucoup Xavier_OM
Je vais pouvoir tester les deux méthodes...
plus ça vas plus je trouve le XML puissant (finalement j'ai fais le bon choix)
Marsh Posté le 12-03-2009 à 21:11:13
Xavier_OM a écrit : Rapidement ton truc je commencerai comme ça moi :
|
Merci xavier,
ça marche, enfin une hiérarchie correcte
Voici ce que ca donne
0 Banc d'Essais |
Juste Quelques questions...
1) Pourquoi utilisée (<xsl:apply-templates select='../..//GED_Essais/Sommaire[Pere = $current]'> ) c'est le (select='../..//GED_Essais/Sommaire) qui me bloque et pourquoi pas select='//GED_Essais/Sommaire . Cette question est peut-être bête mais le xsl est plus une envie d'apprendre que mon métier premier.
2) comment on fait pour supprimer les doublons dans cette méthode?!?
Dans ce que j'avais crée en copient sur un model, j'avais utilisé:
Code :
|
et vu la réponse que tu avais donner je sais plus ver ou aller
Xavier_OM a écrit : En général en xslt on utilise très peu les for-each, les if et les call-template... |
Marsh Posté le 13-03-2009 à 10:26:35
JojoSs75 a écrit : |
// est un raccourci pour descendant-or-self::, c'est à dire "context node + descendants of this context node"
.. est un raccourci pour parent::, c'est à dire "parent of context node"
apply-templates, contrairement à call-template, change le nœud courant (on se déplace de nœuds en nœuds quand on fait des apply-templates)
Donc //, contrairement à ce que tu penses, ne part pas de la racine du document pour aller partout, il part du nœud courant.
Mais en effet si tu ne fais que des call-template, tu ne déplaces jamais ton noeud courant qui reste donc '/' du début à la fin, auquel cas // se comportera bien comme tu penses.
En écrivant ../../GED_Essais/Sommaire[condition] je remonte de 2 étages à partir du nœud courant donc... se déplacer dans le xml c'est comme se déplacer dans ton explorateur de fichiers (qui est aussi une arborescence), on remonte de 2 crans puis on redescend ailleurs.
JojoSs75 a écrit : |
?
Marsh Posté le 14-03-2009 à 00:52:49
Salut Xavier
Xavier_OM a écrit : // est un raccourci pour descendant-or-self::, c'est à dire "context node + descendants of this context node" |
Merci pour cette reponse claire.
Xavier_OM a écrit : 2) comment on fait pour supprimer les doublons dans cette méthode?!? |
Plour etre plus claire j'utilise mon xml comme base de connaissances, est plour ceci j'ai une page avec toutes mes node.
la page que tu m'as aidé a crée vas me permetre de filtrer par categories comme ci dessous:
0 Banc d'Essais
4 Notice
4 Trame
4 Trame
4 Notice
0 Boite de Vitesses
0 Moteur
4 Entretiens
0 Vieillissement
4 Diesel
4 Essence
8 Cycles
8 Cycles
8 Définition
Mais comme tu vois:
Trame apparais deux fois, si j'ai 20 trames ils apparaitrons 20 fois
tous comme Notice et Cycles
Xavier_OM a écrit : En général en xslt on utilise très peu les for-each, les if et les call-template... |
Encore une derniere si tu n'utilise pas les if je suposse que tu les remplaces par des choise?
Mon but future apres avoir résolut les doublons et de crée la mise en forme suivant le resultat de ($indent) rediriger vers un template doubler d'un css.
Marsh Posté le 14-03-2009 à 12:00:06
File un exemple de xml qui te donne plusieurs entrées identiques, histoire de voir. (à mon avis faut jouer avec les formes muenchiennes)
Et non, if et choose c'est pareil, on utilise ni l'un ni l'autre On définit des templates très précis (avec des xpath assez évolués pour ne matcher qu'un seul cas)
Marsh Posté le 14-03-2009 à 12:50:48
merci de tes réponse
Xavier_OM a écrit : File un exemple de xml qui te donne plusieurs entrées identiques, histoire de voir. (à mon avis faut jouer avec les formes muenchiennes) |
formes muenchiennes???
faut ue fasse des recherche sur cette nouvelle forme
Xavier_OM a écrit : Et non, if et choose c'est pareil, on utilise ni l'un ni l'autre On définit des templates très précis (avec des xpath assez évolués pour ne matcher qu'un seul cas) |
Ok pour la reponse... je pense que je vais m'en sortir sans trop de PB
Marsh Posté le 15-03-2009 à 00:08:37
Xavier_OM a écrit : File un exemple de xml qui te donne plusieurs entrées identiques, histoire de voir. (à mon avis faut jouer avec les formes muenchiennes) |
J'ai trouvé "Muenchiennes" c'est la fonction "key"
Impossible d'utiliser des variables dans cette expression.
Apres avoir passé mon samedi à cherché, j'ai ma tete comme une pasteck...
du coup j'hesite entre "generate-id" & "Key" et je vois toujours pas comment faire pour la suite...
Marsh Posté le 15-03-2009 à 00:37:37
Jte ferai remarquer que j'ai posté un exemple de muenchian method l'autre jour
Marsh Posté le 15-03-2009 à 09:41:49
Xavier_OM a écrit : Jte ferai remarquer que j'ai posté un exemple de muenchian method l'autre jour |
OUI, j'ai vus ça, et je te remercie. Ce qui m’a bloquer c’était ta phase :
Un autre truc pas tout à fait trivial qui pourra te servir (ou pas) : generate-id() |
Mon PB est de le positionner dans un premier temps.
J'ai pensé reprendre :
Code :
|
En quelque chose comme ceci:
Code :
|
Je sais que ce n’est pas comme ça...
Mais je tourne en rond... Et j'arrive pas à mixé tes deux exemples...
La seule certitude que j’ai c’est que le traitement ce fait dans le Template "write-with-indentation"
Mais je ne vois pas du tout comment utiliser "value"…
Peux-tu m'aider en me disant quel "template" changer... STP
Et le lien avec $value, je tourne en rond,
Merci d’avance
Nota: la seul notion de xml/xsl que j'ai c'est de l'autodidacte... et ce que je fait est personnel.
Marsh Posté le 15-03-2009 à 12:05:14
JojoSs75 a écrit :
|
xslt est une technologie pas facile à aborder
Même si c'est un bon outil pour transformer du xml, ce n'est pas forcément le bon outil pour toi si tu n'as pas le niveau pour t'en servir.
Je ne dis pas ça méchamment, j'ai appris xslt en autodidacte moi aussi , mais :
- l'informatique et la prog c'est mon métier
- j'ai fait du xslt au travail, donc j'étais dessus pendant plusieurs jours
- je pense qu'il m'a bien fallu une semaine pour comprendre le "truc" derrière Muench.
Bref ya pas de soucis, on va y arriver, mais selon le temps que tu y consacres et la ou les personnes qui vont maintenir ton code dans l'avenir, c'est peut-être un choix un peu "cryptique" que tu as fait
Un exemple donc, si je reprends mon xlst posté plus haut et que j'ajoute un peu de "Muench" pour éviter les doublons.
Code :
|
En espérant que ça aide.
Marsh Posté le 12-04-2009 à 21:35:26
Xavier_OM a écrit : |
Merci beaucoup Xavier_OM,
Pas eu beaucoup de temps à moi pour le tester a fond...
mais OUI ça marche nickel... meme si j'ai encore un peux de mal a le reproduire pour l'instant...
Xavier_OM a écrit : c'est peut-être un choix un peu "cryptique" que tu as fait |
Surrement, mais meme etre curieur est ma marque de fabrique...
Problème résolu !
JojoSs
Marsh Posté le 02-03-2009 à 22:47:57
Bonjour,
Je Cherche à crée un sommaire qui se hiérarchise suivant les données du *.xml est sans doublon...
Cette section permet de connaitre l’endroit de la hiérarchisation.
<My> et mon niveau actuel
<Pere> et le niveau précédent
"Racine" et le niveau le plus bas du sommaire…
Le résultat que je recherche à avoir et d'utilisée la fonction si pour chaque nœud (../Sommaire/My) en fonction de (../Sommaire/pere)...
Mot (Pere : Racine/ My : mot)
Bv (Pere : Racine/ My : BV)
Auto (Pere : BV/ My : Auto)
Meca (Pere : BV/ My : Meca)
Auto (Pere : BV/ My : Meca)
Meca (Pere : BV/ My : Meca)
Mag (Pere : Racine/ My : mag)
Etc..
Voici les soucis que je rencontre :
1 – Malgré cette fonction
(<xsl:for-each select="//Sommaire[not(My = preceding-sibling::Sommaire/My)]"> ).
Les valeurs sont répétées et je vois pas ou j’ai pu me trompé ??
2 – Je trouve pas comment récupérer la valeur du nœud précédent !!!
Une partie de mon XML
Une partie de mon XSL
<xsl:if test="Pere = My"> je sais pas comment develloper cette fonction sur une boucle precedente
Ma premier boucle De mon Index de niveau 1 (la racine)
Le résultat obtenu (le premier et le dernier devrait disparaitre, mais c'est pas le cas aussi)
Définition <!-- (Pere: Racine, My: Définition)-->Reglage <!-- (Pere: Trame, My: Reglage)-->Merci de votre aide
Message édité par JojoSs75 le 11-10-2014 à 19:35:39