2009-06-05 13 views
14

mam ten XSLT:wywołanie szablonu XSLT z parametrem

<xsl:template name="dumpDebugData"> 
    <xsl:param name="elementToDump" /> 
    <xsl:for-each select="$elementToDump/@*"> 
     <xsl:text>&#10;</xsl:text> <!-- newline char --> 
     <xsl:value-of select="name()" /> : <xsl:value-of select="." /> 
    </xsl:for-each> 
    </xsl:template> 

chcę wyświetlić każdy element (jak nazwa/wartość), jak zgłoszę ten szablon?

+0

* Przykro mi, że mogę dodać odpowiedź, gdy chcę tylko skomentować. Wynika to z ograniczeń StackOverflow opartych na wyniku ... * @samjudson: Jakie problemy wystąpiły w oryginale? Czy możesz wyjaśnić, problemy, które naprawiłeś? Dzięki – Chucky

Odpowiedz

24

Ponieważ szablon oczekuje zbiór węzłów, trzeba zrobić:

<xsl:call-template name="dumpDebugData"> 
    <xsl:with-param name="elementToDump" select="some/xpath" /> 
</xsl:call-template> 
11

Spróbuj czegoś takiego:

<xsl:call-template name="dumpDebugData"> 
    <xsl:with-param name="elementToDump">foo</xsl:with-param> 
</xsl:call-template> 
+0

Czy jest jakiś powód, dla którego to zostało odrzucone? –

+2

ponieważ przekazuje ciąg znaków do szablonu, a nie do zestawu węzłów? – samjudson

+1

To prawda, ale był to prosty przykład, jak wywołać szablon z parametrami. –

2

Istnieje szereg kwestii w swojej oryginalnej XSLT, więc pracował przez i otrzymałeś następujący kod, który robi to, co chcesz Wierzę:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output indent="yes" /> 
    <xsl:strip-space elements="*" /> 
    <xsl:template match="element()"> 
     <xsl:call-template name="dumpDebugData"> 
     <xsl:with-param name="elementToDump" select="." /> 
     </xsl:call-template> 
     <xsl:apply-templates /> 
    </xsl:template> 
    <xsl:template name="dumpDebugData"> 
     <xsl:param name="elementToDump" /> 
     Node: 
     <xsl:value-of select="name()" /> 
     : 
     <xsl:value-of select="text()" /> 
     <xsl:for-each select="attribute::*"> 
     Attribute: 
     <xsl:value-of select="name()" /> 
     : 
     <xsl:value-of select="." /> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 
4

Oryginalna odpowiedź nie użyj parametru. Działa tylko wtedy, gdy parametr = bieżący element. To bierze pod uwagę parametr.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output indent="yes" /> 
    <xsl:strip-space elements="*" /> 
    <xsl:template match="element()"> 
     <xsl:call-template name="dumpDebugData"> 
     <xsl:with-param name="elementToDump" select="." /> 
     </xsl:call-template> 
     <xsl:apply-templates /> 
    </xsl:template> 
    <xsl:template name="dumpDebugData"> 
     <xsl:param name="elementToDump" /> 
     Node: 
     <xsl:value-of select="name($elementToDump)" /> 
     : 
     <xsl:value-of select="text($elementToDump)" /> 
     <xsl:for-each select="$elementToDump/@*"> 
     Attribute: 
     <xsl:value-of select="name()" /> 
     : 
     <xsl:value-of select="." /> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 
Powiązane problemy