Dave: Arrays in XSL

Hi,

ich generiere mittels XSLT aus einem XML ein Formular für eine HTML-Seite.
Nun habe ich ein Problem mit den Labels und der ID des inputs.

Es gibt den Fall das zuerst mehrere Labels nebeneinander stehen sollen und dann erst die Input-Felder, zur Verdeutlichung:

Als ID für die Inputs verwende ich die XSL Funktion "generate-id()", da ich jetzt aber zuerst alle Labels ausgebe muss ich für jedes Label die generierte ID irgendwo Zwischenspeichern, damit ich bei der Ausgabe der inputs die entsprechende wieder habe.

Ich dachte da an etwas wie:

<xsl:for-each select="./input[@type='text']">  
	<xsl:variable name="inputID[position()]" select="generate-id()" />					  
	<label>  
		<xsl:attribute name="for">  
			<xsl:value-of select="$inputID[position()]" />  
		</xsl:attribute>  
		  
		<xsl:value-of select="@label"/>  
	</label>  
	<xsl:if test="position()!=last()">, </xsl:if>  
</xsl:for-each>  
<xsl:for-each select="./input[@type='text']">  
	<input type="text">  
		<xsl:attribute name="id">  
			<xsl:value-of select="$inputID[position()]" />  
		</xsl:attribute>  
	</input>  
</xsl:for-each>

Allerdings kann man so offensichtlich kein Array erzeugen/verwenden.
Meine Suche nach XSL-Arrays blieb bis jetzt erfolglos, enttäuschenderweise habe ich nicht mal einen Workaround gefunden.

Hat jemand eine Idee wie ich das lösen könnte?

Hier noch ein Beispiel des Aufbaus des betroffenen XML:

<fieldset>  
	<input type="text" name="PLZ" label="PLZ" class="w70px">  
		[...]  
	</input>  
	<input type="text" name="Ort" label="Ort" class="w220px" />  
</fieldset>

~Dave

  1. Hallo Dave,

    Hat jemand eine Idee wie ich das lösen könnte?

    Probiere es bezogen auf das XML-Beispiel so (beide Durchläufe erzeugen die zueinander passenden IDs):

      
    <xsl:template match="fieldset">  
      
      <xsl:for-each select="input[@type='text']">  
        <label for="{generate-id()}"><xsl:value-of select="@label"/></label>  
        <xsl:if test="position()!=last()">, </xsl:if>  
      </xsl:for-each>  
      
      <xsl:for-each select="input[@type='text']">  
        <input type="text" id="{generate-id()}" />  
      </xsl:for-each>  
      
    </xsl:template>
    

    Mit Saxon-HE 9.2 erhalten:

    <label for="d1e3">PLZ</label>, <label for="d1e5">Ort</label>  
    <input type="text" id="d1e3"/><input type="text" id="d1e5"/>
    

    Grüße,
    Thomas

    1. Hi,

      bin jetzt erst dazu gekommen deinen Vorschlag zu testen.
      Funktioniert wunderbar, hatte keine Ahnung das generate-id() die ID abhängig von der aktuellen (bzw. übergebenen) Node erzeugt.

      Kommt davon wenn man Funktionen benutzt ohne die Doku zu lesen...

      Vielen Dank.

      ~Dave