2010-06-25 5 views
11

Je suis nouveau dans xslt. J'ai le problème suivant. J'ai besoin dans un xml, pour enlever un attribut spécifique (theAttribute dans l'exemple) d'un élément spécifique (par exemple div). direExclure l'attribut d'un élément xml spécifique à l'aide de xslt

<html> 
    <head>...</head> 
    <body> 
     <div id="qaz" theAtribute="44"> 
     </div> 
     <div id ="ddd" theAtribute="4"> 
     <div id= "ggg" theAtribute="9"> 
     </div> 
     </div> 
     <font theAttribute="foo" /> 
    </body> 
</html> 

pour devenir

<html> 
    <head>...</head> 
    <body> 
     <div id="qaz"> 
     </div> 
     <div id ="ddd"> 
     <div id= "ggg"> 
     </div> 
     </div> 
     <font theAttribute="foo" /> 
    </body> 
</html> 

Où attribut theAtribute a été supprimé. J'ai trouvé ceci, http://www.biglist.com/lists/xsl-list/archives/200404/msg00668.html basé sur lequel j'ai fait des tentatives pour trouver la bonne solution.

-à-dire <xsl:template match="@theAtribute" />

qui a enlevé du document entier ... et d'autres comme match se choisir, etc. Rien n'a fonctionné .. :-(pouvez-vous s'il vous plaît aidez-moi à ce sujet? Sonner trivial me , mais avec xslt, je ne peux pas faire face à tous ...

Merci à tous à l'avance

+0

si vous voulez le code à formater, vous pouvez sélectionner le code et cliquez sur le bouton « 010101 » en haut du panneau d'édition, ou retrait du texte 4 espaces. –

Répondre

22

Qu'est-ce qui ne fonctionne pas? voulez-vous que le même contenu, juste sans @theAtribute?

Si oui, assurez-vous que votre feuille de style a le modèle vide pour @theAtribute, mais a aussi un modèle d'identité qui copie tout autre dans la sortie:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <!--empty template suppresses this attribute--> 
    <xsl:template match="@theAtribute" /> 
    <!--identity template copies everything forward by default--> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Si vous voulez seulement supprimer certains @theAtribute, alors vous pouvez faire les critères de correspondance plus spécifique. Par exemple, si vous ne vouliez enlever cet attribut du div qui est @id="qaz", vous pouvez utiliser ce modèle:

<xsl:template match="@theAtribute[../@id='qaz']" /> 

ou ce modèle:

<xsl:template match="*[@id='qaz']/@theAtribute" /> 

Si vous souhaitez supprimer @theAttribute de tous les éléments div, puis remplacez l'expression de correspondance par:

<xsl:template match="div/@theAtribute" /> 
+0

Bonjour, ces deux j'avais trouvé aussi bien que j'ai peur mais ils ne sont pas utiles. le premier supprime le "theAtribute" de partout (divs, body, font, etc tags). La deuxième approche supprime de partout l'attribut @the de tous les nœuds avec id = qaz. Y at-il un moyen pour moi d'écrire ?? ce dont j'ai besoin, c'est un mélange de ces deux je pense, mais je ne peux pas comprendre le format en raison de l'ignorance de mi sur xslt. Je supprimer l'attribut the de tous les divs et uniquement de divs. – Alexandros

+1

Je vois. Je n'ai pas réalisé dans la description que vous vouliez spécifiquement exclure 'div/@ theAtribute'. J'ai mis à jour la réponse.Si vos éléments XML sont liés à un espace de noms, vous devrez peut-être déclarer l'espace de noms dans votre XSLT, ou utiliser une instruction XPATH qui ignore l'espace de noms et correspond au nom local (par exemple '* [local-name() = 'div ']/@ theAtribute') –

+0

Cela a fonctionné !!!! solution parfaite et réponse très rapide. Merci Hansen !!!! – Alexandros

8

Dans la sélection, vous pouvez exclure (ou inclure) l'attribut en utilisant la fonction de nom.

Par exemple, <xsl:copy-of select="@*[name(.)!='theAtribute']|node()" />

+0

Cela a bien fonctionné pour moi, je voulais remplacer un attribut et ensuite copier le reste, et cette expression a bien fonctionné pour "le reste" – davenpcj

Questions connexes