set selected-Attribut von html option element innerhalb wählen Sie basierend auf der äußeren for-each-index
Der Titel klingt viel komplexer als das problem wirklich ist: ich habe versucht, die Dinge zusammenzufügen, die von bits und Stücke gefunden auf stackoverflow und anderswo, aber ich kann nicht ganz herausfinden.
Aufgabe: ich habe eine Liste von Sachen, die ich will zu Durchlaufen und in jeder iteration, ich möchte ein drop-down-Liste und dann standardmäßig wählen Sie das Element basierend auf dem aktuellen Gesamt-index.
Beispiel wird es sehr deutlich.
Hier die XML:
<?xml version="1.0" encoding="UTF-8"?>
<Plants>
<Plant PlantId="13" PlantType="Tree"/>
<Plant PlantId="25" PlantType="Flower"/>
<Plant PlantId="70" PlantType="Shrub"/>
</Plants>
Dann habe ich einige 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="html" indent="yes" encoding="UTF-8" omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:param name="listIdx" select="0">
</xsl:param>
<table>
<thead>
<tr>
<td>PlantType</td>
</tr>
</thead>
<tbody>
<xsl:for-each select="Plants/Plant">
<tr>
<td>
<select>
<xsl:for-each select="/Plants/Plant">
<xsl:element name="option">
<xsl:attribute name="value">
<xsl:value-of select="@PlantId"/>
</xsl:attribute>
<xsl:if test="count(.) = 2">
<xsl:attribute name="selected">selected</xsl:attribute>
</xsl:if>
<xsl:value-of select="@PlantType"/>
</xsl:element>
</xsl:for-each>
</select>
</td>
</tr>
</xsl:for-each>
</tbody>
</table>
</xsl:template>
</xsl:stylesheet>
Was ich bekomme ist diese:
PlantType
Baum [=dropdown-Liste mit Baum, Blume, Strauch]
Baum [=dropdown-Liste mit Baum, Blume, Strauch]
Baum [=dropdown-Liste mit Baum, Blume, Strauch]
Was ich lieben würde, zu haben ist:
PlantType
Baum [=dropdown-Liste mit Baum, Blume, Strauch (idx 1 voreingestellt)]
Blume [=dropdown-Liste mit Baum, Blume, Strauch - (idx-2 vorgewählt)]
Strauch [=dropdown-Liste mit Baum, Blume, Strauch (idx 3 vorwahlzeiten)]
Ich denke, es gibt zwei Ansätze: 1) verwenden Sie ein listIdx in der äußeren Schleife (match) und dann vergleichen Sie den aktuellen index in der inneren Schleife mit listIdx. 2) vergleichen Sie inneren Liste-index mit äußeren Liste index on-the-fly. Wenn es leicht genug, um zu veranschaulichen die wichtigsten Komponenten, würde ich das sehr zu schätzen! Danke!
- Ihre zur Verfügung gestellten aktuellen und wollten Ausgänge können nicht produziert werden, sofern die transformation. Bitte Bearbeiten Sie die Frage, und korrigieren Sie diesen Widerspruch. Insbesondere die genaue wollte, ergeben sich aus der transformation-nicht eine verbale Beschreibung, und nicht, wie ein browser anzuzeigen. Auch, feststellen, dass in
<xsl:if test="count(.) = 2">
der test-Bedingung ist immerfalse()
, weil die Anzahl der einem einzelnen Knoten (.
) ist immer 1.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Sie tun können, ist eine variable definieren, die in Ihrem äußeren Schleife zum halten der aktuellen position der pflanze element
Dann, in Ihrem inneren Schleife, können Sie die zweite position gegen diese variable, die auch noch im Rahmen
Hier ist die vollständige XSLT-in diesem Fall
Diese erzeugt die folgende Ausgabe
Allerdings ist es oft besser zu verwenden xsl:apply-templates über xsl:for-each, wenn auch nur zur Vermeidung einer übermäßigen Einzug. Man könnte auch passen Sie die position, die als parameter in diesem Fall. Die folgenden XSLT ebenfalls erzeugt die gleiche Ausgabe
Beachten Sie auch die Verwendung von Attribut-Wert-Vorlagen zum erstellen der Wert - Attribut auf die option element (und Hinweis: es gibt keine wirkliche Notwendigkeit zu verwenden xsl:element zu erstellen, die eine statisch-name-element)