Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2966 connectés 

  FORUM HardWare.fr
  Programmation
  XML/XSL

  remplacer des mots par des liens (XML to HTML via XSLT)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

remplacer des mots par des liens (XML to HTML via XSLT)

n°2269591
Profil sup​primé
Posté le 13-11-2015 à 10:23:32  answer
 

Bonjour,

 

Je ne connais pas très bien XSLT, je suis malgré tout arrivé à faire tout ce que je voulais sauf une chose qui est bien plus compliquée que le reste.

 

J'ai une liste de chaines de caractère avec comme path /root/ressources/ressource/linkwords/linkword

 

Je voudrais remplacer dans un attribut "text" toutes les occurences des chaines contenues dans la liste précédente, par un lien <a href=...> dont la valeur est la chaine en question  avec la forme suivante :

Code :
  1. <a href="#" class="ressource" data-rid="$id">$linkword</a>
 

Où $linkword est la chaine remplacée et $id est le ressource@id (attribut ID de la ressource) qui correspond à ce "linkword".

 

Si ce n'est pas clair, l'idée est en fait que je veux détecter toutes les références à une ressource dans mes articles, et les remplacer automatiquement par un lien menant vers elles. Les "linkword" d'une ressource sont les différentes dénominations possibles qui peuvent en être faites.

 

J'ai envisagé plusieurs choses sans succès : par exemple je ne suis pas arrivé à procéder de façon itérative avec des fonctions, apparemment il faudrait procéder de façon récursive; J'ai pensé faire une fonction prenant en paramètre le "curseur" du prochain linkword dans la liste parcourue (foreach) des éléments du xpath "/root/ressources/ressource/linkwords/linkword" mais je n'y suis pas parvenu - et il reste le problème du replace qui ne fonctionne pas si simplement avec des tags HTML...

 

Bref si vous avez des idées plus précises, elles sont très bienvenues !

 

Merci d'avance pour votre aide

 


Message édité par Profil supprimé le 13-11-2015 à 10:23:53
mood
Publicité
Posté le 13-11-2015 à 10:23:32  profilanswer
 

n°2269698
rufo
Pas me confondre avec Lycos!
Posté le 15-11-2015 à 12:21:22  profilanswer
 

J'ai déjà fait ce genre de traitement, mais pas via du XSLT (trop compliqué je pense). Je suis passé par Javascript et php. En gros, mon traitement était un "plugin" qui se déclenchait quand l'article (ie page) était chargée. Une requête ajax envoyait à un script php l'iD de l'article (page) à  traiter. Le script php récupérait le contenu et le parsait. Il repérait les mots correspondant à des articles en base (requête SQL donc). Pour le ou les groupes de mots pour lesquels il y avait correspondance, j'associais une url (celle de l'article). Je me limitais à des correspondances de groupes de 4 mots. A la fin, je faisais un str_replace() des groupes de mots par leur url. Le script ajax renvoyait au javascript le contenu de l'article "enrichi". Javascript se chargeait de rempalcer le contenu chargé par ce nouveau contenu.
 
Attention, en cas d'article long, ce genre de traitement est long puisque pour chaque mot, au pire des cas, tu génères 4 requêtes SQL pour trouver une correspondance : requête pour le premier mot, puis pour le premier+2ème, puis premier+2ème+3ème et enfin, 1er+2ème+3ème+4ème et après, tu passes au 2ème mot pour lequel tu fais les 4 requêtes SQL...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2269731
Profil sup​primé
Posté le 16-11-2015 à 10:52:31  answer
 

rufo a écrit :

J'ai déjà fait ce genre de traitement, mais pas via du XSLT (trop compliqué je pense). Je suis passé par Javascript et php. En gros, mon traitement était un "plugin" qui se déclenchait quand l'article (ie page) était chargée. Une requête ajax envoyait à un script php l'iD de l'article (page) à  traiter. Le script php récupérait le contenu et le parsait. Il repérait les mots correspondant à des articles en base (requête SQL donc). Pour le ou les groupes de mots pour lesquels il y avait correspondance, j'associais une url (celle de l'article). Je me limitais à des correspondances de groupes de 4 mots. A la fin, je faisais un str_replace() des groupes de mots par leur url. Le script ajax renvoyait au javascript le contenu de l'article "enrichi". Javascript se chargeait de rempalcer le contenu chargé par ce nouveau contenu.
 
Attention, en cas d'article long, ce genre de traitement est long puisque pour chaque mot, au pire des cas, tu génères 4 requêtes SQL pour trouver une correspondance : requête pour le premier mot, puis pour le premier+2ème, puis premier+2ème+3ème et enfin, 1er+2ème+3ème+4ème et après, tu passes au 2ème mot pour lequel tu fais les 4 requêtes SQL...


 
Merci pour ta réponse.
 
Dans mon cas j'essaie de garder ça en full xml/xsl pour la génération et html+jquery pour le rendu.
en effet je pourrai gérer le search & replace avec jquery et je vais peut être faire ça.
pour éviter des requêtes multiples je peux dump un XML qui contient  la liste de mes "linkwords". mais s'il faut effectuer une centaine de search & replace ça risque de freeze le navigateur non ?
 
Sinon, quelqu'un que je connais qui connait pas mal le xsl s'est amusé à me faire un exemple pour cas un peu différent du mien
 
https://gist.github.com/lucasgauthe [...] 1baff0666d
 
J'ai fait une modif naive qui ne fonctionne pas pour adapter à mon cas (ou plusieurs linkwords peuvent appartenir à une meme ressource alors que dans son exemple le linkword est le "nom" d'une personne et il est unique) : https://gist.github.com/lucasgauthe [...] 70cf748c4f
 
la raison étant que {$person/../../@id} ne retourne rien puisque bien sur puisque le copy of de la function find-matching-person ne contient pas l'info sur les parents apparemment
 
merci encore

n°2269738
rufo
Pas me confondre avec Lycos!
Posté le 16-11-2015 à 11:37:14  profilanswer
 

C'est pour ça qu'on ne travaille pas sur juste un mot mais sur un groupe. Faire ça sans langage serveur (déléguer au navigateur donc), ça peut avoir du sens : tout faire traiter par le serveur pourrait l'engorger en cas de trafic important. Mais faudra du javascript, c'est clair. XSLT n'est pas assez puissant je pense pour faire tout le traitement que tu veux (ou alors au prix d'un code complexe et difficilement maintenable) :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2269745
Profil sup​primé
Posté le 16-11-2015 à 12:51:11  answer
 

C'est clair que c'est pas facile pour moi qui n'y connais rien en XSL mais la personne que je mentionnais m'a donné la solution ! La voici :

 

https://gist.github.com/lucasgauthe [...] 906cde3320

 

Et j'ai testé dans mon code, ça fonctionne à merveille !
XSL est vraiment puissant mais faut bien connaitre c'est sur. En tout cas je préfère cette solution, au moins toute la transformation est gérée par XSL de cette façon.

 

merci pour tes réponses (quand même :D )


Message édité par Profil supprimé le 16-11-2015 à 12:51:35

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  XML/XSL

  remplacer des mots par des liens (XML to HTML via XSLT)

 

Sujets relatifs
envois page html[VB6] Remplacer l'ensemble des contenus des nodes par des CDATA
Macro rechercher remplacer liens hypertexte EXCEL 2010débutant en html/css, comportement incompréhensible à mes yeux
[RegExp] Expression régulière : recherche sur 2 motsFormulaire HTML CSS vers PHP MYSQL
Problème adresse HTML[RESOLU] Utiliser la méthode setTimeout sans HTML
remplacer une ligne dans un fichier 
Plus de sujets relatifs à : remplacer des mots par des liens (XML to HTML via XSLT)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR