2010-06-04 22 views
26

tengo el siguiente fragmento de código en mi archivo XSLT:XSLT cómo agregar atributos para copiar-de

<xsl:copy-of select="/root/Algemeen/foto/node()" /> 

En el archivo XML del nodo /root/Algemeen/foto/ tiene una imagen en HTML, por ejemplo: < img src = "somephoto.jpg"/>

Lo que me gustaría hacer es agregar un ancho fijo a la imagen. Pero el siguiente no funciona:

<xsl:copy-of select="/root/Algemeen/foto/node()"> 
    <xsl:attribute name="width">100</xsl:attribute> 
</xsl:copy-of> 

Respuesta

43

xsl:copy-of realiza una copia en profundidad del nodo seleccionado, pero no proporciona una oportunidad para alterarlo.

Querrá usar xsl:copy y luego agregar nodos adicionales dentro. xsl:copy solo copia los atributos de nodo y espacio de nombres, pero no los atributos regulares y los nodos secundarios, por lo que querrá asegurarse de que apply-templates también empujen a los otros nodos. xsl:copy no tiene un @select, funciona en el nodo actual, así que donde sea que esté aplicando el <xsl:copy-of select="/root/Algemeen/foto/node()" /> , necesitará cambiar a <xsl:apply-templates select="/root/Algemeen/foto/node()" /> y mover la lógica img a una plantilla.

Algo como esto:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <result> 
    <xsl:apply-templates select="/root/Algemeen/foto/img"/> 
     </result> 
    </xsl:template> 

<!--specific template match for this img --> 
    <xsl:template match="/root/Algemeen/foto/img"> 
     <xsl:copy> 
      <xsl:attribute name="width">100</xsl:attribute> 
      <xsl:apply-templates select="@*|node()" /> 
      </xsl:copy> 
    </xsl:template> 

<!--Identity template copies content forward --> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

funcionó de maravilla. Muchas gracias –

Cuestiones relacionadas