Script negli XSL

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

Print | posted @ Monday, April 3, 2006 3:24 PM

Comments on this entry:

Gravatar # re: Script negli XSL
by Massimo Gentilini at 4/3/2006 7:14 PM

Attenzione attenzione attenzione: se usate XslTransform della classe .Net 1.1 c'è un memory leak determinato dall'uso della Evidence.

Probabilmente SharePoint non fa usare gli script per quello. Le nuove classi del FW 2.0 hanno deprecato la classe XslTransform ma soffrono dello stesso problema visto che di default non consentono di fare script che necessitino della evidence stessa.

Saluti
Massimo
Gravatar # re: Script negli XSL
by Omar Damiani at 9/29/2006 5:21 PM

Beh, purtroppo non ho mai utilizzato XMLSpy per sviluppare (e debuggare) XSLT quindi non vorrei fosse coinvolto in qualche modo.

Ad ogni modo, non riesco nemmeno a debuggare correttamente senza avere l'xml che deve essere trasformato.

Errori di sintassi a prima vista non sembrano essercene, ma se ci fosse la possibilità di debuggare sarebbe tutt'altro discorso.
Gravatar # re: Script negli XSL
by bjorne at 6/7/2009 9:32 PM

XMLSPY usa di default il suo Parser integrato, e questo parser non e compatibile con la funzione MSSXLXcript

per evitare questo errore bisogna settare il parser preferito (io con MSXML 4 riesco a usare gli script) andando in Tools - Options - XSL e selezionare quindi il parser

ricordate, pero, che per il Debug XMLSPY si appoggia esclusivamente al suo parser interno (opzione non configurabile)
Comments have been closed on this topic.