2010-06-07 16 views
7

modificar un solo atributo con XSLT

¿Cuál es la XSLT simple que se pueda imaginar para transformar el valor de la primera, en este caso solamente, /configuration/system.web/compilation/@debug atributo de true a false?

+0

Buena pregunta (+1). Vea mi respuesta para una solución corta, simple y correcta. La respuesta de Lucero en este momento es bastante incorrecta --ver mi comentario a su respuesta. –

Respuesta

6

Esta transformación:

<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="system.web/compilation[1]/@debug"> 
    <xsl:attribute name="debug">false</xsl:attribute> 
</xsl:template> 
</xsl:stylesheet> 

cuando se aplica en este documento XML:

<configuration> 
    <system.web> 
     <compilation debug="true" defaultLanguage="C#"> 
      <!-- this is a comment --> 
     </compilation> 

     <compilation debug="true" defaultLanguage="C#"> 
      <!-- this is another comment --> 
     </compilation> 
    </system.web> 
</configuration> 

produce el, resultado correcto deseada: modifica el atributo debug de la primera compilation niño de cualquier elemento system.web (pero sabemos que hay ly un elemento system.web en un archivo de configuración.

<configuration> 
    <system.web> 
     <compilation debug="false" defaultLanguage="C#"> 
      <!-- this is a comment --> 
     </compilation> 
     <compilation debug="true" defaultLanguage="C#"> 
      <!-- this is another comment --> 
     </compilation> 
    </system.web> 
</configuration> 

Como vemos, sólo el primer atributo se debug modifird a false, según sea necesario.

+1

Esto se llama transformación de patrón de identidad para XSLT, y como señaló @Dimitre Novatchev, es extremadamente poderoso. – lavinio

+0

Es una pena que el elemento 'xsl: attribute' tenga que mencionar el nombre del atributo que se va a cambiar, cuando eso ya se ha dado en el XPath que coincide con el' xsl: template' que lo acompaña. ¿Hay alguna manera de decir "establecer este atributo, como se llame"? –

+0

@TomAnderson: Se puede usar la notación AVT: '' Esto no es lo que quieres, pero en cierto sentido es incluso mejor. –

-1

<xsl:attribute name="debug">false</xsl:attribute> dentro del <compilation>? ¿O estoy malentendiendo la pregunta?

Cuestiones relacionadas