2010-08-22 11 views
6

Tengo dos archivos XSL: "one.xsl" y "two.xsl"Cómo utilizar una función de un XSL en otro

one.xsl:

<xsl:function name="x:trans" as="xs:string"> 
    <xsl:param name="str"></xsl:param> 
    <xsl:variable name="res1" select="x:translate_string($str)"/> 
    <xsl:sequence select="$res1"/> 
</xsl:function> 
</xsl:stylesheet> 

quiero usar función "x: trans" en "one.xsl"

¿Cómo hago referencia a la función de otro archivo?


El problema es que cuando intento llamar a esta función de esta manera:

< xsl:value-of select="x:trans('Hello World')"/> 

me sale el siguiente mensaje de error del navegador:

Referencia a prefijo de espacio de nombres no declarado: 'x '

+0

Si ha importado o incluido "one.xsl", también deberá declarar el espacio de nombres "x" en "two.xsl" si desea usarlo. –

+3

Además, menciona que el mensaje de las funciones * browser * ... custom ** es una función XSLT 2.0 **. Actualmente, no hay navegadores compatibles con XSLT 2.0. Si desea que los navegadores ejecuten su XSLT, necesitará una solución * XSLT 1.0 *. –

+0

Buena pregunta (+1). Vea mi respuesta para una explicación completa, paso a paso, de cómo llamar a 'xsl: function'. –

Respuesta

1

En two.xsl:

<xsl:include href="one.xsl" /> 

Consulte también la descripción de incluir en el XSLT 2.0 spec.

4

Desea hacer <xsl:include /> o <xsl:import />. <xsl:include /> es más simple (simplemente arrastra todo) mientras que <xsl:import /> es más flexible (si hay plantillas que colisionan entre las dos, la anulación de llamadas por parte de la llamada está mejor definida y generalmente es más sensata).

Editar para obtener información añadida:

Usted necesita asegurarse de que llame las plantillas en la hoja de estilo importada utilizando el espacio de nombres appopriate. La manera más fácil es asegurarse de que tiene declaraciones xmlns: foo coincidentes en las hojas de estilo, aunque podría llamar a foo: plantilla en una hoja de estilo como barra: plantilla en la otra si tuviera xmlns: barra en su lugar.

+0

+1 Generalmente prefiero importar más que incluir, ya que proporciona más flexibilidad. –

+0

+1 y lo mismo para preferir xsl: import –

+0

¡Sí! Importar todo el camino –

7

Además de las respuestas correctas que usted necesita para <xsl:include> o <xsl:import> (recomiendo esta última como la primera a menudo puede dar lugar a errores de duplicación), su otro problema es el siguiente:

  1. El nombre de una función debe pertenecer a un espacio de nombre.

  2. El espacio de nombre debe declararse (definido y vinculado a un prefijo) en el mismo archivo en el que se define la función.

  3. Cualquier llamada a la función tiene que prefijar el nombre de la función y ese prefijo debe estar enlazado con el mismo espacio de nombres a la que el nombre de la función pertenece

Aquí está un ejemplo sencillo:

I.deleteA.xsl archivo define la función my:double

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:my="my:my" 
    > 
<xsl:function name="my:double" as="xs:double"> 
    <xsl:param name="pArg" as="xs:double"/> 

    <xsl:sequence select="2*$pArg"/> 
</xsl:function> 
</xsl:stylesheet> 

II. Al archivo Archivo deleteB.xsl importaciones deleteA.xsl y utiliza la función my:double:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:my="my:my"> 
    <xsl:import href="deleteA.xsl"/> 

    <xsl:output method="text"/> 

    <xsl:template match="/"> 
     <xsl:sequence select="my:double(.)"/> 
    </xsl:template> 
</xsl:stylesheet> 

III. La transformación contenida en deleteB.xsl se aplica en el siguiente documento XML:

<t>1</t> 

y el resultado correcto se produce:

2 

comentario adicional: En la actualidad no navegador soporta XSLT 2.0 transformaciones - xsl:function solo está disponible en XSLT 2.0 +.

Cuestiones relacionadas