2009-03-23 6 views
18

Je dois copier du document d'entrée au document de sortie tous les attributs sauf un.Comment ne pas copier certains attributs?

Mon entrée est comme ceci:

<mylink id="nextButton" type="next" href="javascript:;" /> 

Et je besoin d'une sortie comme ceci:

<a id="nextButton" href="javascript:;" /> 

Si j'utilise le XSL suivant:

<xsl:template match="mylink"> 
    <a><xsl:copy-of select="attribute::*"/></a> 
</xsl:template> 

Je reçois tous les attributs à sortie comme ceci:

<a id="nextButton" type="next" href="javascript:;" /> 

Mais je veux ignorer l'attribut « type ». J'ai essayé ce qui suit, mais aucun d'entre eux ne semble fonctionner la façon dont je besoin:

<xsl:copy-of select="attribute::!type"/> 
<xsl:copy-of select="attribute::!'type'"/> 
<xsl:copy-of select="attribute::*[!type]"/> 
<xsl:copy-of select="attribute::not(type)"/> 

Comment devrais-je écrire ma feuille de style pour obtenir une sortie nécessaire?

Répondre

31

Shortest forme:

<xsl:template match="mylink"> 
    <a><xsl:copy-of select="@*[name()!='type']"/></a> 
</xsl:template> 

plus longue (c'est la première chose que je suis venu avec, je laisse pour référence):

<xsl:template match="mylink"> 
    <a> 
    <xsl:for-each select="@*"> 
     <xsl:if test="name() != 'type'"> 
     <xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute> 
     </xsl:if> 
    </xsl:for-each> 
    </a> 
</xsl:template> 
+0

La forme courte a fonctionné excellent. Je vous remercie! – martsraits

+0

J'ai utilisé le plus long pour échanger le nom d'un attribut ("change' type' en 'class'"). Y a-t-il une version de la plus courte qui accomplira la même chose? –

-1

Dans XSLT 2.0:

<xsl:template match="mylink"> 
    <a><xsl:copy-of select="@* except @type"/></a> 
</xsl:template> 
Questions connexes