2012-03-30 10 views
17

Jaki jest najkrótszy/najczystszy/zalecany sposób przekazania aktualnego węzła kontekstu do wywoływanego szablonu i czy ten węzeł staje się węzłem kontekstu wewnątrz szablonu wywoływanego?XSLT Przekaż bieżący kontekst w szablonie wywołania

Byłoby miło (tak, prawda?), Gdyby szablon bez xsl: param i wywoływany przez pusty szablon wywołania po prostu podniósłby węzeł kontekstu dzwoniącego, ale najlepiej mogę myśleć o tym:

<xsl:call-template name="sub"> 
     <xsl:with-param name="context" select="." /> 
    </xsl:call-template> 

z

<xsl:template name="sub"> 
    <xsl:param name="context" /> 
    <xsl:for-each select="$context"> 

    </xsl:for-each> 
</xsl:template> 

Odpowiedz

22

byłoby miło (to będzie, prawda?), jeśli szablon bez xsl:param i zwanego przez pustą call-template po prostu podnieść węzeł kontekstu dzwoniącego.

Dokładnie jak xsl:call-template jest zdefiniowana w opisie W3C XSLT 1,0 (2,0) i realizowane dowolnym zgodny procesora XSLT.

Oto mały przykład:

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

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

<xsl:template name="currentName"> 
    Name: <xsl:value-of select="name(.)"/> 
</xsl:template> 
</xsl:stylesheet> 

Kiedy transformacja ta jest stosowana na poniższym dokumencie XML:

<t> 
<a/> 
</t> 

poszukiwany, poprawny wynik jest produkowany:

Name: a 
+0

Dzięki Dimitre. Nie widziałem tego udokumentowanego i wydawało się, że nie działa, gdy go wypróbowałem. Nie szukałem we właściwym miejscu i musiałem robić coś złego. +1 Q odpowiedział. Twoje zdrowie. – JPM

+0

@JPM: Nie ma za co. Być może patrzyłeś na instrukcję 'xsl: function' w XSLT 2.0 - jest ona różna od nazwanego szablonu, ponieważ nie odbiera kontekstu wywołującego funkcji i jeśli wywołujący musi przekazać swój węzeł kontekstu jako parametr, jeśli ten węzeł kontekstu musi zostać przekazany. –

4

Po prostu w innym tłumaczeniu tego, co powiedział Dimitre.

Po wywołaniu szablonu z węzła, jesteś już istnieje w tym węźle,

przykład:

zakładać ten kod:

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

<xsl:template name="XYZ> 
    <xsl:value-of select="."/> 
</xsl> 

Powyższy kod jest tak dobra, jak pisanie :

<xsl:template match="MyElement"> 
    <xsl:value-of select="."/> 
</xsl:template> 

Możesz użyć również dla każdej pętli w szablonie wywoływanym. :)

Ale po prostu mieć pewność, gdzie dokładnie są ..

Powiązane problemy