Schleife ohne for-each
Moni
- xml
0 Cheatah0 Michael Wronna0 Michael Wronna0 Moni0 Moni0 Thomas J.S.0 Moni0 Moni0 Thomas J.S.
0 Thomas J.S.
Hi,
kennt jemand ne Möglichkeit eine Schleife ohne for-each, nur mit xsl-templates zu realisieren?
Hab hier n sehr simples XML-beisp.:
<FAHREN>
<FAHRZEUG typ="auto" src="bild1.gif" alt="Das ist ein Auto"/>
<FAHRZEUG typ="fahrrad" src="bild2.gif" alt="Das ist ein Fahrrad"/>
<FAHRZEUG typ="dreirad" src="bild3.gif" alt="Das ist ein Dreirad" />
....
</FAHREN>
möchte die Nodes FAHRZEUG durchiterieren, ohne dass ich eine for-each schleife benutze.
Hab für jedes Fahrzeug ein eigenes Bild, was dazukommt. Das ganze möchte ich mit templates zusammenfassen. Hier erstmal eine variabale erzeugen, damit man jedes node ansprechen kann. (experimentell und funzt auch nich) :
<xsl:param name="mobil">
<xsl:value-of select="//FAHRZEUG/@typ"/>
</xsl:param>
<img src="<xsl:value-of select="//FAHRZEUG[@typ=$mobil]/@src"/>" alt="<xsl:value-of select="//FAHRZEUG[@typ=$mobil]/@alt"/>"/>
(vereinfachtes img tag! normalerweise stünde da xsl:text)
Hab gelesen dass das durchiterieren mit templates geht aber ich finde es nicht mehr... ohne Iteration habe ich in der HTML immer das erste node FAHRZEUG stehen...
Hilfe
Danke
Moni
Hi,
möchte die Nodes FAHRZEUG durchiterieren, ohne dass ich eine for-each schleife benutze.
<xsl:apply-templates /> oder <xsl:call-template />.
<img src="<xsl:value-of select="//FAHRZEUG[@typ=$mobil]/@src"/>" alt="<xsl:value-of select="//FAHRZEUG[@typ=$mobil]/@alt"/>"/>
(vereinfachtes img tag! normalerweise stünde da xsl:text)
Öh. Wie wäre es mit <img src="{//FAHRZEUG[@typ=$mobil]/@src}" .../> oder <img><xsl:attribute name="src" select="//FAHRZEUG[@typ=$mobil]/@src"/>...</img>?
Cheatah
hallo moni,
folgendes, leider ungetestet. wenn ich mal 10 minuten zeit
habe werde ich evtl es testen und das ergebnis posten.
<xsl:template name="Fahren" match="//Fahren">
xsl:apply-templates/
</xsl:template>
<xsl:template name="Fahrzeug" match="//Fahren/Fahrzeug">
... Zuweisungen ..
</xsl:template>
hth, gruss vom bodensee, michael
hallo moni,
nochmal ich: es tut, habe es gerade getestet! mann (frau),
muss mir langweilig sein :-) erneute gruesse,
michael
Hi Michael,
ich bau das mal ein. Bin gespannt! Vielen DANK nochmal !!
liebe Grüsse
Moni
PS: DANKE natürlich auch an CHEATAH ! ;)
Hallo,
leider hats nich geklappt! Es wird immer der erste node angezeigt! .. bin am verzweifeln! Dankeee !!!
hier mein code:
--XML---
<web>
<control>
<BUTTON name="new" href="eins.html" src="eins.jpg" alt="eins"/>
<BUTTON name="del" href="zwei.html" src="zwei.jpg" alt="zwei"/>
<BUTTON name="edit" href="drei.html" src="drei.jpg" alt="drei"/>
<BUTTON name="cancel" href="vier.html" src="vier.jpg" alt="vier"/>
</control>
</web>
--XSL---
<xsl:template match="/">
<table>
<tr><td>
<xsl:apply-templates select="control">
<xsl:with-param name="btnName" select="new"/>
</xsl:apply-templates>
</td></tr>
<tr><td>
<xsl:apply-templates select="control">
<xsl:with-param name="btnName" select="del"/>
</xsl:apply-templates>
</td></tr>
<tr><td>
<xsl:apply-templates select="control">
<xsl:with-param name="btnName" select="edit"/>
</xsl:apply-templates>
</td></tr>
<tr><td>
<xsl:apply-templates select="control">
<xsl:with-param name="btnName" select="cancel"/>
</xsl:apply-templates> </td></tr>
</table>
</xsl:template>
<xsl:template name="control" match="control">
<xsl:apply-templates select="BUTTON"/>
</xsl:template>
<xsl:template name="BUTTON" match="BUTTON">
<xsl:param name="btnName">
<xsl:value-of select="//BUTTON/@name"/>
</xsl:param>
<xsl:text disable-output-escaping="yes"><img src="</xsl:text>
<xsl:value-of select="//BUTTON[@name=$btnName]/@src"/>
<xsl:text disable-output-escaping="yes">" href="</xsl:text>
<xsl:value-of select="//BUTTON[@name=$btnName]/@href"/>
<xsl:text disable-output-escaping="yes">" alt="</xsl:text>
<xsl:value-of select="//BUTTON[@name=$btnName]/@alt"/>
<xsl:text disable-output-escaping="yes">" border="0"/></xsl:text>
</xsl:template>
was mach ich falsch??
xsl:apply-templates/ kann ich nich einsetzen, weil ich noch mehr XML daten habe, die dann an ungeeigneter stelle angezeigt werden. *seufz*
lieben Gruss
Moni
Hallo,
Es wird immer der erste node angezeigt!
Ersten du rufst hier ein Template auf, für den du aber gar keine Parameter definiert hast, also wird dein with-param nichts bewirken.
<xsl:apply-templates select="control">
<xsl:with-param name="btnName" select="new"/>
</xsl:apply-templates>
<xsl:template name="BUTTON" match="BUTTON">
<xsl:param name="btnName">
<xsl:value-of select="//BUTTON/@name"/>
</xsl:param>
Der Paramter hier an dieser Stelle selektiert genau des erste BUTTON-Element aud dem Dokument. Außerdem du willst ja den Parameter später bekannt geben.
<xsl:text disable-output-escaping="yes"><img src="</xsl:text>
<xsl:value-of select="//BUTTON[@name=$btnName]/@src"/>
<xsl:text disable-output-escaping="yes">" href="</xsl:text>
<xsl:value-of select="//BUTTON[@name=$btnName]/@href"/>
<xsl:text disable-output-escaping="yes">" alt="</xsl:text>
<xsl:value-of select="//BUTTON[@name=$btnName]/@alt"/>
<xsl:text disable-output-escaping="yes">" border="0"/></xsl:text>
Das ist mächtig viel Lärm um nichts und es macht dir das Leben zur Hölle wenn du mit solchen Kontrukten arbeiten willst.
Du _kannst_ Elemente normal in einem XSL-Sheet schreiben: diese sind dann die 'literal result elements' und werden in das Ergebnisdokument hineingeschreiben.
<xsl:value-of select="//BUTTON[@name=$btnName]/@src"/>
xsl:value-of enthält als Wert _immer_ nur den ersten Knoten auf dem der XPath-Ausdruck im select="" passt. (auch wenn es mehrere solche Knoten gäbe)
was mach ich falsch??
Alles was nur geht. ;-)
So könnte dein Template aussehen (wobei du beachten solltest, dass ein <img> in HTML kein Attribut href haben darf!):
<xsl:template match="control/BUTTON">
<xsl:param name="btnName" />
<xsl:if test="$btnName = name">
<img src="{@src}" href="{@href}" alt="{@alt}" border="0" />
</xsl:if>
</xsl:template>
und so könntest du es aufrufen:
<tr><td>
<xsl:apply-templates select="control/BUTTON">
<xsl:with-param name="btnName" select="new"/>
</xsl:apply-templates>
</td></tr>
Die _eigentliche_ Frage ist, was möchtest du erreichen?
Ich nehme an du möchtest die BUTTON-Elemente gruppiert nach dem @name-Attribut ausgeben. Wenn ja, solltest du dich mit key() und xsl:key beschäftigen. Im Archiv findest du jede Menge Lösungen dazu.
Grüße
Thomas
Hi Thomas,
danke erstmal. Aber das xsl:key kann man nur im zusammenhang mit for-each benutzen. Und for-each kann ich nicht einsetzen. Jedes BUTTON-Element hat einen eigenen name-attribut, das ich abfragen und dementsprechend das <img> mit Daten füllen muss. Die Tabelle , in der die NavigationsBUTTONS angeordnet ist, kann man nich mit for-each erstellen, da sie eine komplexe und unregelmässige Struktur hat.
Ich bin noch am rumexperimentiern... mit Deinem o.g. Code wird gar nichts im HTML angezeigt.. aber danke dennoch!
liebe Grüsse
Moni
Hi nochmal!
Es funzt endlich!! hatte nen Knacks im Auge ich blindfisch! Danke an alle Helfer!
lieben Gruss
Moni
Hallo,
danke erstmal. Aber das xsl:key kann man nur im zusammenhang mit for-each benutzen.
Nicht dass ich es wüsste.
»»Und for-each kann ich nicht einsetzen. Jedes BUTTON-Element hat einen eigenen name-attribut, das ich abfragen und dementsprechend das <img> mit Daten füllen muss. Die Tabelle , in der die NavigationsBUTTONS angeordnet ist, kann man nich mit for-each erstellen, da sie eine komplexe und unregelmässige Struktur hat.
Dafür gibts ja aplay-templates.
Ich bin noch am rumexperimentiern... mit Deinem o.g. Code wird gar nichts im HTML angezeigt.. aber danke dennoch!
<xsl:with-param name="btnName" select="new"/> --> sollte natürlich so:
<xsl:with-param name="btnName" select="'new'"/> , habe auch nur C&P gemacht.
Grüße
Thomas
Hallo,
es reichen:
<xsl:template name="Fahren" match="Fahren">
<xsl:template name="Fahrzeug" match="Fahrzeug">
aktiviert und aufgerufen werden die Templates durch xsl:apply-templates/ in entsprechenden Stellen dann automatisch.
Grüße
Thomas