2012-04-03 3 views
0

lösen habe ich eine VorlageXSLT: Machen Sie Pfade in der Vorlage/in Bezug auf die Vorlage

<xsl:template name="template"> 
<xsl:param name="param"/> 
</xsl:template> 

, die ich

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

Dies löst den Inhalt des Anrufs mit. zu einer Zeichenfolge und übergibt sie an die Vorlage.

Es löst jedoch. relativ zum Vorlagenaufruf. Wenn ich den Kontext innerhalb der Vorlage ändere, wie kann ich den Parameter in der Vorlage relativ zum neuen Kontext auflösen?


Beispiel hinzugefügt, wie pro Anfrage:

<xsl:template name="template"> 
    <xsl:param name="param1"/> 
    <xsl:param name="param2"/> 
    <xsl:for-each select="$param1"> 
     <xsl:value-of select="func:Lookup($param2)"/> 
    </xsl:for-each> 
</xsl:template> 

<xsl:call-template name="template"> 
    <xsl:with-param name="param1" select="element"/> 
    <xsl:with-param name="param2" select="."/> 
</xsl:call-template> 

wo param1 und param2 bezüglich XPaths.

Ich möchte beide relative XPaths an die Vorlage übergeben und sie dann auflösen. <xsl:for-each select="$param1"> sollte zu einigen Elementen aufgelöst werden, und dann sollte . relativ zu jedem Element aufgelöst werden. $ param2 sollte relativ zu $ ​​param1 aufgelöst werden.

Aber was tatsächlich passiert, ist beides relativ zum Vorlagenaufruf gelöst. Das ist in Ordnung für param1, aber nicht für param2.

Wenn es nicht für die for-each wäre, könnte ich element/. als param2 übergeben. Aber das wird nicht funktionieren wegen der für jeden.

+0

Es sieht für mich aus, dass alles, was Sie tun wollen, viel einfacher gemacht werden kann. Vielleicht können Sie ein Beispiel hinzufügen, was Sie erreichen möchten. – Maestro13

+0

Nur ein Beispiel hinzugefügt. –

+0

Ich habe string ('.') Betrachtet, aber dann löst es sich überhaupt nicht, auch nicht in der Vorlage. –

Antwort

0

Der Parameterwert ist eigentlich ein Knoten (der aktuelle Knoten) kein String, aber Sie haben recht, dass (wie in den meisten Sprachen) der Parameter einen Wert und kein Fragment der Syntax enthält. Wenn Sie wirklich eine Zeichenfolge übergeben müssen (oder häufiger ein xpath-Fragment, das aus der Quelle extrahiert wird), benötigen Sie eine dynamische Evaluierungserweiterung wie axon: evaluate, viele, aber nicht alle Produkte haben eine solche Erweiterung. Wenn die Anforderung einfach wie ein Element Name ist), anstatt willkürlich XPath können Sie eine Zeichenfolge übergeben, wie

<xsl:with-param name="paaram2" select="'foo'"/> 

dann verwenden, wie

<xsl:value-of select="func:Lookup(*[name()=$param2])"/> 

, die das Element <foo/> an die Funktion übergeben wird.

hier von der Innenseite der Expression Auslesens

* 

wählt die alle untergeordneten Elemente des aktuellen Knotens

name() 

gibt dann den Namen dieses Element so

[name()=$param2] 

ist nur für diese untergeordneten Elemente gültig, deren Name im Parameter angegeben ist, also

*[name()=$param2] 

wählt die Elemente mit Namen durch den Parameter spezifiziert und

func:Lookup(*[name()=$param2]) 

wendet die Erweiterungsfunktion auf diese Elemente.

+0

Danke für deine Antwort, aber ich kann es nicht zur Arbeit bringen. Kannst du es erklären? z.B. Wofür ist das '*'? Warum hast du 'name() = $ param2' anstelle von' name ($ param2) 'gesetzt? Mein Verständnis ist, dass 'name()' eine Knotenmenge nimmt und eine Zeichenfolge zurückgibt, anstatt umgekehrt. (Auch ich glaube, Sie sollten '] haben)' statt ')]'.) Dank –

+0

traurig über die Tippfehler beseitigt, wie Sie und Zeile für Ihre Erklärung für Zeilen Beschreibung des Ausdrucks –

+0

Dank hinzugefügt vorgeschlagen. Es funktioniert leider nicht. Ich denke ich brauche sowas wie saxon: beurteile, wie du meinst. –

Verwandte Themen