2012-05-03 12 views
6

Estoy tratando de hacer algo que parece que debería ser muy simple, pero no puedo hacerlo funcionar, y parece que no puedo encontrar ejemplos que no involucre muchas cosas irrelevantes. Quiero actualizar el contenido de texto de una etiqueta xml específica a un valor específico (pasado como parámetro, este XSLT se usará desde hormiga). Un ejemplo sencillo:Actualice el texto de un elemento con XSLT basado en el parámetro

Quiero transformar

<foo> 
    <bar> 
    baz 
    </bar> 
</foo> 

Para

<foo> 
    <bar> 
     something different 
    </bar> 
</foo> 

Esta es la hoja de estilo que he intentado, lo que se traduce en tan sólo las etiquetas, no hay texto en absoluto

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <!-- identity transformation, to keep everything unchanged except for the stuff we want to change --> 
    <!-- Whenever you match any node or any attribute --> 
    <xsl:template match="node()|@*"> 
     <!-- Copy the current node --> 
     <xsl:copy> 
      <!-- Including any attributes it has and any child nodes --> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <!-- change the text of the bar node, in the real template the value won't be specified inline --> 
    <xsl:template match="/foo/bar/"> 
     <xsl:param name="baz" value="something different"/> 
      <xsl:value-of select="$baz"/> 
    </xsl:template> 
</xsl:stylesheet> 

¡Gracias de antemano!

Respuesta

10

Hay una serie de problemas con el código proporcionado que conducen a tiempo de compilación errores:

<xsl:template match="/foo/bar/"> 
    <xsl:param name="baz" value="something different"/> 
     <xsl:value-of select="$baz"/> 
</xsl:template> 
  1. El perfil de compatibilidad se especifica en esta plantilla es sintácticamente ilegal: una expresión XPath no puede finalizar con el carácter /.

  2. xsl:param no se puede tener un atributo desconocido como value

Solució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:param name="pReplacement" select="'Something Different'"/> 

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

<xsl:template match="foo/bar/text()"> 
    <xsl:value-of select="$pReplacement"/> 
</xsl:template> 
</xsl:stylesheet> 

Cuando se aplica esta transformación en el documento XML proporcionado:

<foo> 
    <bar> 
    baz 
    </bar> 
</foo> 

el resultado deseado, adecuados, se produce:

<foo> 
    <bar>Something Different</bar> 
</foo> 
0
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
<xsl:output indent="yes" encoding="UTF-8" method="xml"/> 
<xsl:param name="param-from-ant" as="xs:string"/> 

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

<xsl:template match="/foo/bar"> 
<xsl:value-of select="$param-from-ant"/> 
</xsl:template> 
</xsl:stylesheet> 
+0

He intentado que (tanto en mi ejemplo un poco más complejo, y en [ el ejemplo base] (http://www.xsltcake.com/slices/Y8fojh/4)), pero parece que no funciona? Obtengo una etiqueta vacía de foo. ¿Copié algo mal? – user1126518

+0

Sean, el "código XSLT" proporcionado ocasiona errores de tiempo de compilación con cualquier procesador compatible con XSLT 1.0. –

0

Un enfoque ligeramente diferente:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:param name="replace"/> 

    <xsl:template match="node()|@*"> 
    <xsl:choose> 
     <xsl:when test="text() and name(..)='bar' and name(../..)='foo'"> 
     <xsl:value-of select="$replace"/> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 

Cuestiones relacionadas