2010-02-02 19 views
7

Estoy tratando de usar XSLT para convertir un esquema XML simple a HTML y planeé usar fn:replace para reemplazar las devoluciones (\n) con <p>;. Sin embargo, no puedo entender cómo usar esta función correctamente.Usando la función XPath fn: reemplazar de XSLT

Una versión simplificada de la XSLT estoy usando lee:

<?xml version="1.0"?> 

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:fn="http://www.w3.org/2005/xpath-functions"> 
    <xsl:template match="/root"> 
    <html> 
     <body> 
     <!-- Replace \n with <p> --> 
     <xsl:value-of select="fn:replace(value, '\n', '<p>')" /> 
     </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

y la entrada a este XLST es ej .:

<?xml version="1.0"?> 

<root> 
    <value><![CDATA[ 
    Hello 
    world! 
    ]]></value> 
</root> 

La conversión falla en fn:replace con un NoSuchMethodException. Si cambio la instrucción de reemplazo a

<xsl:value-of select="fn:replace('somestring', '\n', '<p>')" /> 

Recibo una IllegalArgumentException. ¿Cómo uso fn:replace para lograr lo que quiero?

Estoy usando Butterfly XML Editor para probar el XSLT.

Respuesta

7

XPath 2.0 tiene una función de reemplazo que puede usar con cualquier procesador XSLT 2.0 como las herramientas Saxon 9 o AltovaXML o Gestalt. Parece que intenta usar la función con un procesador XSLT 1.0, eso no va a funcionar. En caso de que esté restringido a un procesador XSLT 1.0, deberá implementar el reemplazo con una plantilla recursiva con nombre o con la ayuda de una extensión.

Sin embargo, tenga en cuenta que incluso con XSLT 2.0 su intento de utilizar replace parece incorrecto ya que producirá un nodo de texto con una etiqueta 'p' mientras supongo que desea crear un nodo de elemento 'p' en el resultado. Por lo tanto, incluso con XSLT 2.0, el uso de la cadena de análisis en lugar de reemplazar es más probable que obtenga el resultado que desea.

+1

Thx, mencionando XSLT 2.0 me empujó en la dirección correcta. Al topar con el atributo de versión de ; a 2.0 y utilizando ; Consigo el trabajo hecho. Tal vez la cadena de análisis es más limpia, pero esto hace el trabajo :) – larsmoa

+1

¿Hiciste algo más que simplemente cambiar la versión a 2.0? –

+0

¿me puede decir cómo cambiar el atributo de versión de a 2.0? –

0

Por chocar el atributo de versión de <xsl:stylesheet> a 2.0 y usando

<xsl:value-of select="replace(description, '\n', '<p/>')" disable-output-escaping="yes" />

que era capaz de hacer el trabajo de reemplazar.

+0

¿me puede decir cómo cambiar el atributo de versión de a 2.0? –

+0

@JatinPatel: '' – larsmoa