2017-06-01 6 views
2

Welches Konzept fehlt mir, dass ich nicht bekomme, was ich erwarte? Warum sollte @field auch leer sein, wenn es das zweite Mal übereinstimmt?xslt Anrufvorlage verhält sich nicht wie erwartet

xsl

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:output method="text"/> 

    <!-- sample XSLT snippet --> 
    <xsl:template match="xml"> 
    <xsl:apply-templates select="*" /> 
    <!-- three nodes selected here --> 
    <xsl:call-template name="rshandle" /> 

    </xsl:template> 

    <xsl:template match="foo"> 
    <!-- will be called once --> 
    <xsl:text> 
     foo element encountered 
    </xsl:text> 
    </xsl:template> 

    <xsl:template match="*"> 
    <!-- will be called twice --> 
    <xsl:text> 
     other element ecountered 
    </xsl:text> 
    </xsl:template> 


    <xsl:template name="rshandle" match="foo"> 
    <!-- will be called once --> 
    <xsl:value-of select="@field" /> 
    <xsl:text> 
     oops i did it again! 
    </xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 

xml

<?xml version="1.0" encoding="utf-8"?> 
<?xml-stylesheet type="text/xsl" href="calltemplatematch.xslt"?> 
<!-- sample XML snippet --> 
<xml> 
    <foo field="location"/> 
    <bar /> 
    <baz /> 
</xml> 

erwartet

 other element ecountered 

     other element ecountered 

location 
     oops i did it again! 

Ist

location 
     oops i did it again! 

     other element ecountered 

     other element ecountered 

     oops i did it again! 
+0

Welchen Teil müssen Sie erklären? –

+0

Ich aktualisierte OP, um etwas genauer zu sein. Ich denke, für Anfänger, warum ist @field leer (anstatt Ortszeichenfolge anzuzeigen) auf der zweiten Instanz, die am unteren Rand erscheint? – Rod

+0

Ich fürchte, Sie müssen eine spezifische Frage für jeden Gegenstand stellen, den Sie nicht verstehen. –

Antwort

1

Ihre Erwartungen zu erfüllen, sollte die XSL wie folgt aussehen:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:output method="text"/> 

    <!-- sample XSLT snippet --> 
    <xsl:template match="xml"> 
     <xsl:apply-templates select="*"/> 
     <!-- three nodes selected here --> 
     <xsl:apply-templates select="foo" mode="rshandle"/> 
    </xsl:template> 

    <xsl:template match="foo"/> 

    <xsl:template match="*"> 
     <!-- will be called twice --> 
     <xsl:text>other element ecountered</xsl:text> 
    </xsl:template> 

    <xsl:template match="foo" mode="rshandle"> 
     <!-- will be called once --> 
     <xsl:value-of select="@field"/> 
     <xsl:text>oops i did it again!</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 

Auch, warum @field leer sein würde (nicht ‚Standort‘ zeigt), wenn sie um die zweite Zeit passend?

Weil Sie <xsl:call-template> verwendet haben. Die gute Erklärung von another answer:

Ein Konzept, um mit XSLT zu verstehen, ist das des "aktuellen Knotens". Mit <xsl:apply-templates> geht der aktuelle Knoten mit jeder Iteration weiter, während <xsl:call-template> den aktuellen Knoten nicht ändert. I.e. Die . innerhalb einer aufgerufenen Vorlage bezieht sich auf den gleichen Knoten wie die . in der aufrufenden Vorlage. Dies ist bei Anwendungsvorlagen nicht der Fall.

1

warum auf der zweiten Instanz leer @field wird, die am unteren Rand angezeigt wird?

Denn wenn die „rshandle“ Vorlage genannt ist, ist es aus dem Kontext des xml Wurzelelement genannt wird -, das kein field Attribut hat. Aufruf eine Vorlage ändert nicht den aktuellen Kontext - im Gegensatz Anwendung Vorlagen.

Verwandte Themen