2012-01-19 10 views
14

Czy można przypisać wartość do parametru importowanego arkusza stylów?Parametry arkusza stylów XSLT w zaimportowanych arkuszach stylów

Spodziewałem się czegoś jak

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

jednak, że nie jest dozwolone.

Również tunel = "tak" jest zabroniony w parametrach arkusza stylów.

+0

Czasami można skorzystać z tego, że jeśli szablon w zaimportowanym arkuszu używa parametrów, można go wywołać za pomocą parametrów z importowanego arkusza stylów. –

Odpowiedz

17

Spróbuj tego:

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> 

xsl: variable w importującego stylów może przesłaniać xsl: param w importowanego arkusza stylów, i to skutecznie ustawia wartość parametru.

+0

FYI, z moich testów empirycznych, w arkuszu stylów importowania można zastąpić parametr przy użyciu lub . – Archie

4

Szybkie oka w specyfikacji pokazuje, że taka konstrukcja jest dozwolone: ​​

W skrócie, href jest dozwolone tylko atrybut i nie ma zawartości dozwolonej w ciele elementu.

Jednakże, jeśli rozumiem twój przypadek użycia, powinieneś po prostu ustawić parametr w normalny sposób (używając swojego języka hosta). Nie powinno mieć znaczenia, że ​​zostało zdefiniowane w zaimportowanym arkuszu stylów. Na przykład załóżmy, że masz ten arkusz stylów:

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

których przywóz tego:

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

... następnie ustawienie parametru w normalny sposób powinien po prostu pracować test. Zauważ, że możesz również "zamaskować" parametr z zaimportowanego arkusza, jeśli chcesz podać nową wartość domyślną.

Tak, dodając to do pierwszego arkusza stylów:

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

... spowodowałoby to wydrukować default2 (przesłanianie domyślne z importowanego arkusza).

1

Wystarczy dodać do doskonałej odpowiedzi lwburka (+1), oto kolejny przykład przypisania wartości do parametru w zaimportowanym arkuszu stylów. Nie ma potrzeby dodawania xsl:param do głównego arkusza stylów; po prostu przydzielisz wartość, gdy wywołałeś arkusz stylów (na przykład w wierszu poleceń).

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> 

przykład Saxon Linia komend (ustawienie nowej wartości parametru)

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

wyjście.xml

<out>kuba</out> 
2

Może to również pomocne:

W XSLT 2.0 można przekazać parametry do nadpisane szablonu w importowanym arkuszu stylów i oznacz ją z nadrzędnego szablonu z wykorzystaniem: <xsl:apply-imports>.

Przesyłanie parametrów za pomocą <xsl:apply-imports> jest wyłącznie funkcją XSLT 2.0 - nie jest to możliwe w XSLT 1.0.