Vi sarà capitato, se lavorate con i file XSL, di voler incrementare le variabili.
Cominciamo subito con il dire che il valore di una variabile non è...variabile (perchè le avranno chiamate xsl:variable e non xsl:constant rimane, per me, un mistero).
In realtà, come in tutti gli ambiti informatici, ci sono dei workaround per raggiungere il risultato (ne cito due, uno dei quali è di mio fresco apprendimento):
- Usare i template (questo è un workaround davvero e potrebbe non fare al caso vostro nel 75% dei casi)
- Usare gli script xsl (tag msxsl:script), questo funziona invece nel 99% dei casi, vedrete dove si nasconde quell'1% (guardacaso io ci sono dentro )
Perchè i template potrebbero non fare al caso vostro?
Beh...potrei sbagliarmi e sfuggermi qualcosa, ma davvero non capisco come un template che incrementi una variabile, possa servire ad incrementare una variabile CONTINUAMENTE magari all'interno di un ciclo.
Se poi si include che il template risponde più alla definizione di Procedura che non a quella di Funzione (per chi fosse a digiuno di definizioni diciamo che è la stessa differenza che passa tra una Sub e una Function in VB.Net )...
Ma veniamo alla parte più interessante: il tag msxsl:script.
Per utilizzarlo occorre prima dichiarare che utilizzeremo il suo namespace (msxsl) in questo modo:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt">
Ora siamo liberi di scrivere il nostro script, nel linguaggio che vogliamo:
<msxsl:script language="JScript" implements-prefix="user">
var indice=0;
function Incrementa()
{
indice=indice+1;
return indice;
}
</msxsl:script>
Io solitamente inserisco questo tag sotto quello di apertura (xsl:stylesheet) ma prima di quello di template (xsl:template), non ho provato ad inserirlo all'interno del template, ma non credo sia comunque logicamente corretto.
Avrete notato che a questo punto però ho utilizzato anche un altro namespace: lo "user", e allora ci tocca dichiararlo nell'apertura che quindi diventa:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="http://miodominio.com/miosito">
Ora: come utilizzare questa funzione dal nostro XSL?
Beh...niente di più facile: basta un bel tag xsl:value-of:
<xsl:value-of select="user:Incrementa()"/>
Dato che la variabile (questa volta davvero Variabile) viene inizializzata una volta al valore 0 e poi incrementata, tutte le volte otterremo il suo valore incrementato (stile contatore).
Ovvio che questo trucco può servire ad inserire altre, e più interessanti, funzioni...
Come dite?
Ah...a cosa si riferisce quell'1%?
Beh...al fatto che Sharepoint, che "ben" si integra con tecnologie XML e .Net, purtoppo blocca il fantastico tag msxsl:script...
Quindi...buon divertimento per chi sviluppa su web "libero"...
powered by IMHO 1.3