2012-01-19 8 views
14

¿Es posible asignar un valor a un parámetro de una hoja de estilos importada?Parámetros de hoja de estilos XSLT en hojas de estilo importadas

me esperaba algo como

<xsl:import ... > 
    <xsl:with-param ... 
</xsl:import> 

pero eso no está permitido.

También tunel = "yes" está prohibido en los parámetros de la hoja de estilo.

+0

A veces puede utilizar el hecho de que si una plantilla en la hoja importada usa parámetros, puede llamarla con los parámetros de la hoja de estilo de importación. –

Respuesta

17

Prueba esto:

main.xsl

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

    <xsl:import href="import.xsl"/> 

    <xsl:variable name="param" select="'some-value'"/> 

    <xsl:template match="/"> 
    <xsl:call-template name="foo"/>  
    </xsl:template> 

</xsl:stylesheet> 

import.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:param name="param" select="'default'"/> 

    <xsl:template name="foo"> 
    <out><xsl:value-of select="$param"/></out>  
    </xsl:template> 

</xsl:stylesheet> 

un XSL: variable en la importación de una hoja de estilo XSL puede anular una: param en una hoja de estilo importada, y esto efectivamente establece el valor del parámetro.

+0

FYI, a partir de mis pruebas empíricas, en la hoja de estilo de importación puede anular el parámetro utilizando o . – Archie

4

Un rápido vistazo a las especificaciones de muestra que no se permite tal constructo:

En resumen, href es el único atributo permitido y no hay contenido permitido en el cuerpo del elemento.

Sin embargo, si entiendo tu caso de uso, entonces simplemente debes establecer el parámetro de la manera normal (usando tu lenguaje de host). Realmente no debería importar que se haya definido en la hoja de estilo importada. Por ejemplo, suponga que tiene esta hoja de estilo:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:import href="import.xsl"/> 
    <xsl:template match="/"> 
     <xsl:value-of select="$test"/> 
    </xsl:template> 
</xsl:stylesheet> 

Qué importa esto:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:param name="test" select="'default'"/> 
</xsl:stylesheet> 

... a continuación, establecer el parámetro test de la manera normal sólo debe trabajar. Tenga en cuenta que también puede "enmascarar" el parámetro de la hoja importada si desea proporcionar un nuevo valor predeterminado.

Así, sumando esto a la primera hoja de estilo:

<xsl:param name="test" select="'default2'"/> 

... sería hacer que se imprima default2 (anulando el valor por defecto de la hoja importada).

1

Solo para agregar a la excelente respuesta de lwburk (+1), aquí hay un ejemplo más de asignación de un valor a un parámetro en una hoja de estilo importada.

No necesitaría agregar xsl:param a la hoja de estilo principal; simplemente asignaría el valor cuando llamó a la hoja de estilo (en la línea de comando, por ejemplo).

main.xsl

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

    <xsl:import href="import.xsl"/> 

    <xsl:template match="/"> 
    <xsl:call-template name="foo"/>  
    </xsl:template> 

</xsl:stylesheet> 

import.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:param name="param" select="'default'"/> 

    <xsl:template name="foo"> 
    <out><xsl:value-of select="$param"/></out>  
    </xsl:template> 

</xsl:stylesheet> 

ejemplo saxon línea de comandos (ajuste nuevo valor de parámetro)

java -cp "saxon9.jar" net.sf.saxon.Transform -s:input.xml -xsl:main.xsl -o:output.xml param="kuba" 

salida.xml

<out>kuba</out> 
2

Tal vez esto también es útil:

En XSLT 2.0 se puede pasar parámetros a una plantilla de overriden en una hoja de estilo importada y cree una instancia de la plantilla primordial usando: <xsl:apply-imports>.

Pasar los parámetros con <xsl:apply-imports> es una función exclusiva de XSLT 2.0; esto no es posible en XSLT 1.0.

Cuestiones relacionadas