2010-09-14 5 views
2

J'utilise le script xsl pour supprimer les commentaires de toute la partie du fichier xml. Il supprime en fait les commentaires qui se trouvent dans le nœud parent mais pas dans les autres nœuds intérieurs.xsl pour supprimer les commentaires de tous les nœuds

[édité]

Mise à jour de la question. Mon exigence est de supprimer tous les commentaires de l'ensemble du document XML.

+0

vous pouvez éditer votre question. J'ai fourni une solution qui correspond aux exigences et clarifications dans vos commentaires. –

Répondre

8

Cette transformation:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="node()|@*" name="identity"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="comment()"/> 
</xsl:stylesheet> 

lorsqu'il est appliqué sur tout document XML contenant des nœuds de commentaire, comme celui-ci:

<!-- foo --> 
<a> 
    <!-- bar --> 
    <b> 
     <c><!-- baz --></c> 
    </b> 
</a> 

produit le résultat souhaité (le même document avec le commentaire nœuds dénudés):

<a> 
    <b> 
     <c/> 
    </b> 
</a> 

Prenez note: L'utilisation du modèle de conception XSLT le plus fondamental et puissant - l'utilisation et dominante de la règle d'identité .

+2

+1 pour avoir compris ce que l'OP voulait vraiment dire. :-) – LarsH

+0

+1 bonne estimation! Idem avec seulement le motif '* | @ *': copier les éléments et les attributs ainsi que les règles intégrées pour un autre type de noeud. Mais nous aimons tellement correspondre à la règle d'identité ...;) –

+0

alors, est-ce que name = "identity" est vraiment nécessaire? –

3

Il semble que vous voulez copier seulement les commentaires de l'entrée XML. Et vous dites que votre feuille de style copie certains commentaires mais pas d'autres? Lorsque vous dites "commentaires qui sont dans le nœud parent", voulez-vous dire les commentaires qui sont des enfants du nœud racine (c'est-à-dire en dehors de tous les éléments)? Lorsque j'essaie cette feuille de style, cela fonctionne très bien. Plus précisément, le XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/"> 
     <comments> 
     <xsl:for-each select="//comment()"> 
      <comment><xsl:value-of select="."/></comment> 
     </xsl:for-each> 
     </comments> 
    </xsl:template> 
</xsl:stylesheet> 

course contre l'entrée

<?xml version="1.0" encoding="UTF-8"?> 
<!-- foo --> 
<a> 
    <!-- bar --> 
    <b> 
     <c><!-- baz --></c> 
    </b> 
</a> 

donne la sortie

<?xml version="1.0" encoding="utf-8"?> 
<comments> 
    <comment> foo </comment> 
    <comment> bar </comment> 
    <comment> baz </comment> 
</comments> 

Si ce n'est pas le comportement que vous vouliez, ou si le vôtre ne fonctionne toujours pas sur votre entrée, pouvez-vous poster votre feuille de style entière et un échantillon de votre XML d'entrée, et montrer ce que la sortie actuelle est? Aussi quel processeur XSLT utilisez-vous?

+0

Merci beaucoup d'avoir essayé de comprendre ma question. Mon attente est de supprimer tous les commentaires indépendamment de son emplacement et de ne pas les mettre dans un endroit comme spécifié. Désolé pour la mauvaise question de ce problème – thndrkiss

+0

+1 pour résoudre le problème comme indiqué. :) –

+0

@thndrkiss, ok, je suppose que vous vouliez vraiment dire "supprimer" les commentaires et copier tout le reste. Il est très déroutant que votre exemple XSLT, qui est implicite, tente de "supprimer" les commentaires, sélectionne explicitement les nœuds de commentaire et place intentionnellement des commentaires dans la sortie. ?! Quoi qu'il en soit, on dirait que @Dimitre vous a couvert. – LarsH

Questions connexes