XSLT: ¿Cómo cambiar un valor de atributo durante ?

Tengo un documento XML y quiero cambiar los valores de uno de los atributos.

Primero copié todo de entrada a salida usando:

     

Y ahora quiero cambiar el valor del atributo "type" en cualquier elemento llamado "property" .

Probado en un simple ejemplo, funciona bien:

           

Editado para incluir la sugerencia de Tomalak.

Este problema tiene una solución clásica : el uso y la anulación de la plantilla de identidad es uno de los patrones de diseño XSLT más fundamentales y potentes :

               

Cuando se aplica en este documento XML :

  value1 value2  

el resultado deseado es producido :

  value1 value2  

Las dos respuestas principales no funcionarán si hay una definición xmlns en el elemento raíz:

 < ?xml version="1.0"?>    

Todas las soluciones no funcionarán para el xml anterior.

La posible solución es como:

 < ?xml version="1.0"?>     some new value here         

Necesita una plantilla que coincida con su atributo objective, y nada más.

  This is the value  

Esto es adicional al “copiar todo” que ya tiene (y en realidad siempre está presente por defecto en XSLT). Tener una coincidencia más específica se usará de preferencia.

Tuve un caso similar en el que quería eliminar un atributo de un nodo simple y no pude determinar qué eje me permitiría leer el nombre del atributo. Al final, todo lo que tenía que hacer era usar

@*[name(.)!='AttributeNameToDelete']

Para el siguiente XML:

 < ?xml version="1.0" encoding="utf-8"?>        

Pude hacer que funcionara con el siguiente XSLT:

 < ?xml version="1.0" encoding="utf-8"?>           -added      

Si su documento XML fuente tiene su propio espacio de nombres, necesita declarar el espacio de nombres en su hoja de estilo, asignarle un prefijo y usar ese prefijo cuando se refiera a los elementos del código fuente XML, por ejemplo:

 < ?xml version="1.0" encoding="UTF-8"?>            some new value    

O, si lo prefiere:

 ...    some new value   ... 

ADENDO: En el caso poco probable en el que el espacio de nombres XML no se conoce de antemano, podría hacer:

 < ?xml version="1.0" encoding="UTF-8"?>            some new value   

Por supuesto, es muy difícil imaginar un escenario donde se sepa de antemano que el documento XML fuente contiene un elemento llamado “propiedad”, con un atributo llamado “tipo” que necesita ser reemplazado, pero que aún no conoce el espacio de nombre del documento. He agregado esto principalmente para mostrar cómo su propia solución podría ser optimizada.

También me encontré con el mismo problema y lo resolví de la siguiente manera: