Ignorando 'A' e 'La' durante l'ordinamento con XSLT
Domanda
Mi piacerebbe avere un elenco ordinato ignorando eventuali / articoli indefiniti definiti iniziali 'la' e 'A'. Per esempio:
- La commedia degli errori
- Hamlet
- Sogno di una notte di mezza estate
- La dodicesima notte
- Il racconto d'inverno
Credo che forse in XSLT 2.0 questo potrebbe essere realizzato sulla falsariga di:
<xsl:template match="/">
<xsl:for-each select="play"/>
<xsl:sort select="if (starts-with(title, 'A ')) then substring(title, 2) else
if (starts-with(title, 'The ')) then substring(title, 4) else title"/>
<p><xsl:value-of select="title"/></p>
</xsl:for-each>
</xsl:template>
Tuttavia, voglio utilizzare l'elaborazione in-browser, in modo da avere per utilizzare XSLT 1.0. Esiste un modo per raggiungere questo obiettivo in XLST 1.0?
Soluzione
Questa trasformazione :
<xsl:template match="plays">
<p>Plays sorted by title: </p>
<xsl:for-each select="play">
<xsl:sort select=
"concat(@title
[not(starts-with(.,'A ')
or
starts-with(.,'The '))],
substring-after(@title[starts-with(., 'The ')], 'The '),
substring-after(@title[starts-with(., 'A ')], 'A ')
)
"/>
<p>
<xsl:value-of select="@title"/>
</p>
</xsl:for-each>
</xsl:template>
quando viene applicato su questo documento XML :
produce il desiderato, risultato corretto :
<p>Plays sorted by title: </p>
<p>Barber</p>
<p>The Comedy of Errors</p>
<p>CTA & Fred</p>
<p>Hamlet</p>
<p>A Midsummer Night's Dream</p>
<p>Twelfth Night</p>
<p>The Winter's Tale</p>
Altri suggerimenti
Ecco come vorrei farlo:
<xsl:template match="plays">
<xsl:for-each select="play">
<xsl:sort select="substring(title, 1 + 2*starts-with(title, 'A ') + 4*starts-with(title, 'The '))"/>
<p>
<xsl:value-of select="title"/>
</p>
</xsl:for-each>
</xsl:template>
Aggiorna : Ho dimenticato di aggiungere 1 all'espressione (classico errore off-by-one)
Bene, starts-with
è da XSLT 1.0. Prooflink: il primo risultato della ricerca in Google rendimenti noreferrer XSLT 1.0: funzione inizia-con