2016-03-22 10 views
2

I definiert ein param Array $gen als:Verwendung für xsl param in XPath

<xsl:variable name="inline-array"> 
    <item>western</item> 
    <item>Romance</item> 
    <item>Adventure</item> 
    <item>Drama</item> 
    <item>Comedy</item> 
    <item>Horror</item> 
    <item>Action</item> 
</xsl:variable> 
<xsl:param name="gen" select="document('')/*/xsl:variable[@name='inline-array']/*"/> 

ich eine XML VXML von XSLT übertragen möchten. Param $gen und $gen2 versäumt, den Wert zu wählen, wenn ich es in Xpath

verwendet
<xsl:value-of select>: 
    <filled namelist="MovieSummary"> 
     <if cond="MovieSummary == '{$gen[1]}'"> 
     <prompt> 
      <xsl:value-of select ="//genre[.='western']/../title"/>. <xsl:value-of select ="//genre[.='western']/../summary"/> 
     </prompt> 
    <xsl:for-each select="$gen[position()>1]">   
     <xsl:variable name="gen2"><xsl:value-of select="."/></xsl:variable> 
     <elseif cond="MovieSummary == '{$gen2}'"/> 
     <prompt> 
      <xsl:value-of select ="//genre[.='$gen2']/../title"/>. <xsl:value-of select ="//genre[.='$gen2']/../summary"/> 
     </prompt> 
    </xsl:for-each> 
<else/> 
</if> 
</filled> 

Es konnte den Wert wählen, wenn ich $gen2 anstelle von „Romance“ oder einem anderen Zeichenfolge verwenden. Aber cond="MovieSummary == '{$gen[1]}'" funktioniert gut. Es kann nur erzeugen so etwas wie:

<if cond="MovieSummary == 'western'">`enter code here` 
    <prompt>Range Feud. 
    Clint Turner is arrested for the murder of his girlfriend Judy's  
    father, a rival rancher who was an enemy of his own father. 
    </prompt> 
    <elseif cond="MovieSummary == 'Romance'"/> 
    <prompt>. </prompt> 
    <else/> 
    </if> 

Ich habe versucht:

select ="//genre[.=$gen2]/../summary"; 
select ="//genre[.={$gen2}]/../summary"; 
select ="//genre[.='{$gen2}']/../summary" 

Alle fehlgeschlagen.

+1

Der meiste von Ihnen gepostete Code ist nicht sichtbar. Formatiere es so, dass es sichtbar ist. Und ich bin mir nicht sicher, ob Sie genügend Daten bereitgestellt haben, um daran zu arbeiten. –

+0

Bitte senden Sie ein vollständiges, reproduzierbares Beispiel (einschließlich einer Eingabe) und geben Sie an, ob XSLT 1.0 oder 2.0 verwendet wird. –

Antwort

2

Die Anweisung:

<xsl:for-each select="$gen[position()>1]"> 

bringt Sie im Rahmen der $gen. Aus diesem Zusammenhang den Ausdruck:

<xsl:value-of select ="//genre[.='$gen2']/../title"/> 

wählt nichts, weil // beginnt, sich von der Wurzel des aktuellen Dokuments - aber genre in einem anderen Dokument altogeher ist.

Sie müssen den Kontext zurück in das verarbeitete XML-Dokument ändern, um die Knoten darin zu adressieren.

Hinweis: In XSLT 2.0 kann die Funktion key() Knoten in einem anderen Dokument direkt auswählen, ohne den Gesamtkontext zu ändern.

+0

@Mayoco Ich kann dir nicht weiter helfen, wenn du nicht [mcve] postest. –

+0

@ michael.hor257k: Gute Antwort. Können Sie bitte ein Beispiel für die Änderung des Kontexts in das aktuelle/verarbeitete Dokument angeben? Ich meine: eine Möglichkeit den Kontext des aktuell bearbeiteten Knotens von 'document ('')/...' in das aktuelle Dokument zu ändern? – zx485

+0

@ zx485 Es gibt nur zwei Möglichkeiten, den Kontext zu ändern. Ich werde ein Beispiel geben, nachdem OP ein Beispiel für die Eingabe liefert. –

Verwandte Themen