2012-01-19 20 views
14

È possibile assegnare un valore a un parametro di un foglio di stile importato?Parametri del foglio di stile XSLT nei fogli di stile importati

mi aspettavo qualcosa di simile

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

, ma che non è consentito.

Anche tunnel = "sì" è vietato nei parametri del foglio di stile.

+0

È possibile a volte fare uso del fatto che se un modello nel foglio importato utilizza parametri, è possibile chiamarlo con i parametri del foglio di stile di importazione. –

risposta

17

Prova questa:

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 in un foglio di stile importazione può ignorare un xsl: param in un foglio di stile importato, e questo imposta efficacemente il valore del parametro.

+0

Per mia conoscenza, dal mio test empirico, nel foglio di stile di importazione è possibile sovrascrivere il parametro usando o . – Archie

4

Un rapido sguardo le specifiche mostra che tale costrutto è consentito:

In breve, href è l'unico attributo consentito e non è consentito alcun contenuto nel corpo dell'elemento.

Tuttavia, se capisco il tuo caso d'uso, allora dovresti semplicemente impostare il parametro nel modo normale (usando la tua lingua ospite). Non dovrebbe importare che fosse definito nel foglio di stile importato. Ad esempio, si supponga di avere questo foglio di stile:

<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> 

che importa questo:

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

... quindi impostando il parametro test in modo normale dovrebbe funzionare. Si noti che è anche possibile "mascherare" il parametro dal foglio importato se si desidera fornire un nuovo valore predefinito.

Quindi, l'aggiunta di questo al primo foglio di stile:

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

... causerebbe per stampare default2 (sovrascrivendo il default dal foglio importato).

1

Solo per aggiungere alla risposta eccellente di lwburk (+1), ecco un altro esempio di assegnazione di un valore a un parametro in un foglio di stile importato.

Non è necessario aggiungere xsl:param al foglio di stile principale; dovresti semplicemente assegnare il valore quando hai chiamato il foglio di stile (sulla riga di comando, per esempio).

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> 

esempio anglosassone linea di comando (modificando nuovo valore di parametro)

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

output.xml

<out>kuba</out> 
2

Forse questo è anche utile:

In XSLT 2.0 si può passare parametri a un modello sovresposta in un foglio di stile importato e un'istanza dal modello preminente utilizzando: <xsl:apply-imports>.

Il passaggio dei parametri con <xsl:apply-imports> è una funzionalità solo di XSLT 2.0, che non è possibile in XSLT 1.0.

Problemi correlati