3 Stimmen

Auswahl des xsl-Elements anhand des in einem Parameter definierten Index

Ich möchte ein Element nach Index auswählen, wobei die indizierte Nummer mit einem Parameter übergeben wird. Der Parameter wird über PHP übergeben. Hier ist, was ich versuche:

//PHP
$xslt->setParameter('','player',$player);
$xslt->importStylesheet( $XSL );
print $xslt->transformToXML( $data ); 

//xslt
<xsl:param name="player" data-type="number"/>

<template match="/">
    <xsl:value-of select="result[$player]/@name" />
</template>

Und ich weiß, dass der Wert des Parameters korrekt übergeben wird, weil ich einfach den Wert des Parameters ($player) ausgeben kann und der richtige Wert ausgegeben wird. Wenn ich hart Code die indizierte Zahl "$player" auf eine beliebige Anzahl von Index ich will wie unten:

<template match="/">
    <xsl:value-of select="result[2]/@name" />
</template>

es funktioniert. Was mache ich hier also falsch? Können Sie keine Parameter/Variablen verwenden, um Indizes auszuwählen?

2voto

Mads Hansen Punkte 58777

Möglicherweise wird der Wert Ihres xsl:param als String und nicht als Zahl ausgewertet. Sie können versuchen, ihn explizit in eine Zahl zu konvertieren, indem Sie die number() Funktion.

<xsl:value-of select="result[number($player)]/@name" />

Der Prädikatsfilter, der eine Zahl angibt, ist eine Abkürzung für [position()=$param] . Sie können verwenden xsl:param innerhalb des Prädikatsfilters, etwa so, und es wird die xsl:param Wert als Zahl:

<xsl:value-of select="result[position()=$player]/@name" />

2voto

Dimitre Novatchev Punkte 234995

Wenn ich die indizierte Zahl hart kodiere "$player" auf eine beliebige Nummer des Index I wie unten gewünscht:

<template match="/"> 
    <xsl:value-of select="result[2]/@name" /> 
</template>

es funktioniert.

Nein, jeder konforme XSLT-Prozessor wird nichts auswählen .

result[2]/@name

ist ein relativer Ausdruck gegenüber dem aktuellen Knoten, und der aktuelle Knoten ist der / -- Dokument-Knoten.

Jedes wohlgeformte XML-Dokument hat genau ein Top-Element (niemals zwei), daher

result[2]

ist gleichbedeutend mit:

/result[2]

und wählt nichts aus.

Höchstwahrscheinlich haben Sie es mit einem anderen Ausdruck zu tun, den Sie nicht gezeigt haben (oder die Vorlage passt einfach nicht / ).

Auch :

<xsl:param name="player" data-type="number"/>

Dies ist eine ungültige Syntax. Die <xsl:param> Die Anweisung hat keine data-type Attribut.

In der Tat gibt es in XSLT 1.0 keine Möglichkeit, den Typ von Variablen oder Parametern anzugeben .

Das ist der Grund, warum in:

result[$player]/@name

$player wird als String behandelt - nicht als Ganzzahl.

Um die gewünschte "Indizierung" zu erreichen, verwenden Sie :

result[position()=$player]/@name

El position() Funktion eine Zahl zurück, und dies bewirkt, dass der andere Operand der = Operator in eine Zahl umgewandelt (und als solche verwendet) werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X