71 votes

Comment supprimer des éléments d'un fichier XML en utilisant XSLT avec une feuille de style et xsltproc?

Je dispose de plusieurs fichiers XML qui ont quelque chose de la forme :

Que je souhaite supprimer du fichier.

En utilisant une feuille de style XSLT et l'utilitaire en ligne de commande Linux xsltproc, comment pourrais-je faire cela ?

À ce stade du script, j'ai déjà la liste des fichiers contenant l'élément que je souhaite supprimer, donc le fichier unique peut être utilisé comme paramètre.


EDIT : la question manquait initialement d'intention.

Ce que j'essaie de réaliser est de supprimer l'ensemble de l'élément "Element" où (fruit=="apple" && animal=="cat"). Dans le même document, il y a de nombreux éléments nommés "Element", je souhaite que ceux-ci restent. Donc

Devrait devenir :

136voto

Dimitre Novatchev Points 147842

En utilisant l'un des modèles de conception XSLT les plus fondamentaux : "Remplacement de la transformation d'identité", il suffit d'écrire ce qui suit :

Remarquez comment le deuxième modèle remplace le premier modèle d'identité uniquement pour les éléments nommés "Element" qui ont un attribut "fruit" avec la valeur "apple" et un attribut "animal" avec la valeur "cat". Ce modèle a un corps vide, ce qui signifie que l'élément correspondant est simplement ignoré (rien n'est produit quand il est trouvé).

Lorsque cette transformation est appliquée au document XML source suivant :

... foo... baz... foobar...

le résultat souhaité est produit :

... foo... baz... foobar...

Vous pouvez trouver plus d'exemples de code utilisant et remplaçant le modèle d'identité ici.

13 votes

Malgré que je n'ai même pas posé la bonne question, tu as répondu exactement à ce que j'aurais dû demander! :)

3 votes

Pourquoi ne marquez-vous pas ce message comme la réponse correcte alors ? Il disparaîtrait ensuite de la liste des problèmes non résolus.

2 votes

A dû attendre jusqu'à ce que je vérifie que cela fonctionnait, et je n'ai pas eu l'occasion de le faire aujourd'hui au travail. C'est fait maintenant, merci Dimitre.

3voto

Sboisen Points 31

La réponse de @Dimitre Novatchev est certainement à la fois correcte et élégante, mais il y a une généralisation (que l'OP n'a pas demandée) : que se passe-t-il si l'élément que vous voulez filtrer a également des éléments enfants ou du texte que vous voulez conserver ?

Je crois que cette légère variation couvre ce cas :

La condition de correspondance peut être complexe à spécifier pour d'autres attributs, etc., et vous pouvez utiliser plusieurs modèles de ce genre si vous supprimez d'autres éléments.

Ainsi, cette entrée :

    Voici du texte à conserver
    Conservez ce texte mais pas l'élément; et conservez ce qui suit.
    Conservez également ce texte et cet élément enfant aussi, ainsi que ce qui suit.

produit cette sortie :

    Voici du texte à conserver
    Conservez ce texte mais pas l'élément; et conservez ce qui suit.
    Conservez également ce texte et cet élément enfant aussi, ainsi que ce qui suit.

Crédit à XSLT Cookbook.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X