XSLT - Comment garder seulement voulu éléments de XML
J'ai un certain nombre de fichiers XML qui contiennent beaucoup de frais généraux. Je tiens à les garder seulement environ 20 éléments spécifiques et filtrer rien d'autre. Je connais tous les noms des éléments que je veux garder, je sais aussi qu'ils soient ou non des éléments d'enfant et qui sont leurs parents. Ces éléments que je veux garder après la transformation doivent toujours avoir leur origine hiérarchique de placement.
E. g. Je veux garder SEULEMENT
<ns:currency>
dans;
<ns:stuff>
<ns:things>
<ns:currency>somecurrency</ns:currency>
<ns:currency_code/>
<ns:currency_code2/>
<ns:currency_code3/>
<ns:currency_code4/>
</ns:things>
</ns:stuff>
Et la faire ressembler à ceci;
<ns:stuff>
<ns:things>
<ns:currency>somecurrency</ns:currency>
</ns:things>
</ns:stuff>
Quelle serait la meilleure manière de construire une transformation XSLT pour accomplir cette?
- Double Possible de Comment faire pour supprimer des éléments de xml en utilisant la feuille de style xslt avec et xsltproc?
- Dans cet exemple, vous spécifiez les éléments à sortir, j'ai besoin de spécifier les éléments à quitter le filtre et rien d'autre.
- Je suis d'accord avec MarcoS. C'est un doublon. L'on a accepté la réponse est à peu près ce que vous avez besoin
- Pour l'exemple que j'ai donné, vous pouvez utiliser cette solution, j'en conviens. Mais pour la question générale que j'ai donné, il ne fonctionne pas. Comme je l'ai expliqué, j'ai besoin de la solution inverse de cela, j'ai besoin de spécifier ce que je veux garder, pas ce que je veux supprimer; Il y a beaucoup plus d'éléments que j'ai besoin de l'enlever que j'ai besoin de garder, ainsi, il ne serait pas logique de spécifier toutes celles que je veux supprimer.
- Peut-être que vous pouvez essayer de revenir le corps de ces deux modèles...
- Je ne vois pas comment cela pourrait fonctionner. Peut-être que je ne vous comprends bien, vous avez un exemple?
- Bonne question, +1. Voir ma réponse pour une solution générale qui peut être utilisé pour conserver tout élément dont le nom est dans une "liste blanche" et aussi de préserver les relations structurelles de ces éléments dans le document. Vous pouvez toujours utiliser cette transformation pour tout ce genre de tâche.
- Également ajouté des explications détaillées. 🙂
Vous devez vous connecter pour publier un commentaire.
Cette transformation générale:
lorsqu'il est appliqué sur le document XML fourni par le (avec définition d'espace de noms ajoutés à faire, c'est bien-formé):
produit le résultat voulu (white-listé les éléments et leurs relations structurelles sont conservés):
Explication:
L'identité de la règle/modèle des copies de tous les nœuds "comme est".
La feuille de style contient un haut niveau de
<ns:WhiteList>
élément dont<name>
enfants spécifier toutes dans la liste blanche de l'élément de noms -- les éléments qui doivent être conservés avec leurs relations structurelles dans le document.La
<ns:WhiteList>
élément est le mieux gardé dans un document distinct, de sorte que la feuille de style n'auront pas besoin d'être modifié avec de nouveaux noms. Voici la liste blanche est dans la même feuille de style juste pour des raisons de commodité.Un seul modèle est primordial de l'identité du modèle. Il n'a pas de processus (supprime) tout élément qui n'est pas dans la liste blanche et n'a pas de descendant qui est dans la liste blanche.
node()
(élément de texte, commentaire de l'instruction de traitement) et chaque attribut.*[not(descendant-or-self::ns:currency)]
serait suffisant.<xsl:template match="teacher/number"/>
. Ce modèle ne tient pas compte deteacher/number
éléments (effextively la "suppression" de leur. Tous ces modèles devraient être mis (pour une meilleure flexibilité et de commodité) dans un autre<xsl:stylesheet>
et il doit être importé (<xsl:import>
) de la première feuille de style XSLT application.Dans XSLT-vous l'habitude de ne pas supprimer les éléments que vous voulez supprimer, mais vous copier les éléments que vous souhaitez conserver:
L'exemple ci-dessus exemplaires seulement
currency
etcurrency_code3
. Le résultat est le suivant:Note: j'ai ajouté une déclaration d'espace de noms pour votre préfixe
ns
.Si vous voulez une copie tout à l'exception de quelques éléments, vous pouvez voir ce réponse