Ho una situazione in cui ciclo attraverso una serie di nodi ordinata e applicare un modello su ciascuno dei nodi:Ordinamento di una serie di nodi prima di passare alla xsl: for-each
<div id="contractscontainer">
<xsl:for-each select="document">
<xsl:sort select="content[@name='ClientName']/text()" />
<xsl:apply-templates select="." mode="client-contract" />
</xsl:for-each>
</div>
voglio fare qualcosa di speciale con la " prima "5 nodi nel set di nodi e renderli elementi nidificati. Il problema è che devono essere nello stesso ordine come se fossero ordinati (come sono nel ciclo).
Avevo programmato di farlo utilizzando due elementi xsl:for-each
, ciascuno con i nodi corretti selezionati dal set. Non posso fare questo, però, perché hanno bisogno di essere ordinati prima posso selezionare il "primo" 5.
Esempio:
<div id="contractscontainer">
<div class="first-five">
<xsl:for-each select="document[position() < 6]">
<xsl:sort select="content[@name='ClientName']/text()" />
<xsl:apply-templates select="." mode="client-contract" />
</xsl:for-each>
</div>
<div class="rest-of-them">
<xsl:for-each select="document[position() > 5]">
<xsl:sort select="content[@name='ClientName']/text()" />
<xsl:apply-templates select="." mode="client-contract" />
</xsl:for-each>
</div>
</div>
Non credo che questo lavoro perché mi seleziono i nodi in base alla posizione prima di ordinandoli, ma non posso usare xsl:sort
al di fuori dello xsl:for-each
.
Mi si avvicina in modo errato?
Edit: La mia soluzione attuale è quella di ordinarli e memorizzare il ordinato impostato in un'altra variabile:
<xsl:variable name="sorted-docs">
<xsl:for-each select="document">
<xsl:sort select="content[@name='ClientName']/text()" />
<xsl:copy-of select="." />
</xsl:for-each>
</xsl:variable>
Funziona, ma c'è un modo migliore?
Buona domanda (+1). La tua soluzione attuale non è male, ma la variabile xsl: con gli elementi ordinati è di tipo RTF e devi usare la funzione di estensione xxx: node-set() in XSLT 1.0. Vedi la mia soluzione come fare questo senza la necessità di alcuna funzione di estensione. –
Sì, ho finito per fare proprio questo: using exsl: node-set(). Grazie per la tua soluzione! –