remplacer des mots par des liens (XML to HTML via XSLT) - XML/XSL - Programmation
Marsh Posté le 15-11-2015 à 12:21:22
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...
Marsh Posté le 16-11-2015 à 10:52:31
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. |
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
Marsh Posté le 16-11-2015 à 11:37:14
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)
Marsh Posté le 16-11-2015 à 12:51:11
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 )
Marsh Posté le 13-11-2015 à 10:23:32
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 :
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