- Sometimes you just can't see the BDC Metadata Store for the Proxies: http://community.obilogic.co.uk/blogs/teamblog/archive/2010/11/04/sometimes-you-just-can-t-see-the-metadata-store-for-the-proxies.aspx
Trasformazione di stringhe in XSLT
<xsl:template name="replaceCharsInString">
<xsl:param name="stringIn"/>
<xsl:param name="charsIn"/>
<xsl:param name="charsOut"/>
<xsl:choose>
<xsl:when test="contains($stringIn,$charsIn)">
<xsl:value-of select="concat(substring-before($stringIn,$charsIn),$charsOut)" disable-output-escaping="yes" />
<xsl:call-template name="replaceCharsInString">
<xsl:with-param name="stringIn" select="substring-after($stringIn,$charsIn)"/>
<xsl:with-param name="charsIn" select="$charsIn"/>
<xsl:with-param name="charsOut" select="$charsOut"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$stringIn"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Il template si richiama, dove serve, passando tre parametri: la stringa originale, la stringa da sostituire, la stringa corretta.
<xsl:call-template name="replaceCharsInString">
<xsl:with-param name="stringIn" select="string(@iltuoTitolo)"/>
<xsl:with-param name="charsIn" select="'&'"/><!-- ATTENZIONE, la stringa & è inclusa tra apici singoli '&' -->
<xsl:with-param name="charsOut" select="'%26'"/><!-- ATTENZIONE, anche questa stringa è contenuta tra apici singoli '%26' -->
</xsl:call-template>
Un aspetto interessante di questo template è che può essere utilizzato anche per gestire la presentazione dei campi di lookup a selezione multipla, trasofrmando un elenco di stringhe separate da punto e virgola in quello che volete (es. un elenco puntato/numerato). Per fare questo è necessaria una piccola modifica al template, giusto per inserire nell'output il codice HTML corrispondente alla nuova formattazione.
Un'altra trasformazione che spesso viene richiesta (per scelta o per forza vista l'estrema fantasia di editors e contributors... :)) è quella da maiuscolo a minuscolo o viceversa. In questo caso non è necessario utilizzare un template custom, è sufficiente creare due variabili e utilizzare la funzione OOTB translate. Ecco come fare (lowercase to uppercase, per gestire il processo inverso invertire la posizione delle due variabili nella funzione translate).
<xsl:variable name="vLowercaseChars_CONST" select="'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:variable name="vUppercaseChars_CONST" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:variable name="normalizedChars" select="translate(@ilvostrocampoqui, $vLowercaseChars_CONST , $vUppercaseChars_CONST)" />
Una pecca di queste tre righe è quella di non prevedere la possibilità di inserire caratteri intermedi con uno stile diverso, come ad esempio una maiucola dopo un punto. Se qualcuno ha scritto un template per gestire questo aspetto è il benvenuto su queste pagine ;)
- Riccardo XSLT e comparazione tra date
<xsl:variable name="cheoresono" select="ddwrt:TodayIso()"></xsl:variable>
A questo punto creo altre due variabili nelle quali memorizzo le due date da paragonare "trasformate" in un valore numerico. L'obbiettivo è quello di ottenere una stringa del tipo 201007261734 (YYYYMMAAHHmm) - @TEST è la mia colonna di tipo Data e ora:
<xsl:variable name="testconverted" select="number(concat(substring(string(@TEST),1,4), substring(string(@TEST),6,2), substring(string(@TEST),9,2), substring(string(@TEST),12,2), substring(string(@TEST),15,2)))" />
<xsl:variable name="cheoresonoconverted" select="number(concat(substring($cheoresono,1,4), substring($cheoresono,6,2), substring($cheoresono,9,2), substring($cheoresono,12,2), substring($cheoresono,15,2)))" />
A questo punto posso effettuare il confronto delle due date con il semplice xsl:if
<xsl:if test="$testconverted > $cheoresonoconverted">@TEST è maggiore di questo momento (secondi esclusi)</xsl:if>
Non volendo inserire all'interno del template XSL questo tipo di filtro (forse più utile per formattazione condizionale che per filtro) potrei applicarlo allo stesso modo nella query XPath presente nella dataview all'interno del template dvt_1:
<xsl:variable name="cheoresono" select="ddwrt:TodayIso()"></xsl:variable>
<xsl:variable name="cheoresonoconverted" select="number(concat(substring($cheoresono,1,4), substring($cheoresono,6,2), substring($cheoresono,9,2), substring($cheoresono,12,2), substring($cheoresono,15,2)))" />
<xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row[number(concat(substring(string(@TEST),1,4), substring(string(@TEST),6,2), substring(string(@TEST),9,2), substring(string(@TEST),12,2), substring(string(@TEST),15,2))) < $cheoresonoconverted]"/>
Per quanto riguarda XSLT è tutto. E per quanto riguarda CAML... (traggo spunto da una maglietta di mio figlio che raffigura la Banda Bassotti) Maybe Next Time :)
-Riccardo
- UPDATE -
Con Barbara abbiamo scoperto un comportamento "strano" di ddwrt:TodayIso(). In alcuni ambienti questa funzione mostra data e ora della time zone GMT, nel nostro caso quindi risulta indietro di due ore. Per risolvere questo "problema" basta memorizzare la variabile cheoresono già formattata utilizzando l'estensione ddwrt:FormatDate(ddwrt:TodayIso(),1040,5). Una volta fatto questo bisogna solo prestare attenzione a modificare i parametri della funzione substring utilizzata nella conversione della data in formato AAAAMMGGHHmm.
Ringrazio ovviamente Barbara per avermi fatto notare questo comportamento :) Controlli di validazione in custom list form



A questo punto riconfiguro il controllo di validazione in modo che sia legato al nuovo campo di testo. Alcuni dei parametri più importanti sono ControlToValidate (permette di specificare quale campo di input debba essere validato), ErrorMessage (permette di specificare il messaggio di errore) e a mio parere anche Display (permette di specificare l'ingombro del controllo quando non visualizzato). Abbiamo inoltre la possibilità di impostare svariati parametri legati all'aspetto del messaggio che al momento tralascio.

Faccio un discorso a parte per il parametro "ValidationExpression". Questa impostazione servirà per specificare il tipo di controllo da effettuare e nello specifico la regual expression che deve essere verificata. SPD ci viene incontro fornendoci un limitato numero di controlli preconfigurati, tra i quali (ma guarda un po') anche il controllo sul formato dell'indirizzo e-mail.

Una volta salvata la pagina, provando ad inserire un dato diverso da un indirizzo e-mail otterremo il messaggio di errore configurato.

In questo esempio ho utilizzato un controllo di tipo RegularExpressionValidator in quanto abbiamo già a disposizione un pattern di verifica accettabile. Nel caso di controlli personalizzati (ad esempio lunghezza minima e massima di una stringa) all'interno di una custom list form non potremo usare una RegEx, a causa di caratteri "speciali" riservati ad XSL come ad esempio le parentesi graffe. Un modo per aggirare l'ostacolo può essere quello di utilizzare il controllo CustomValidator che ci permette di specificare una funzione JS che si occupi per noi di tutte le verifiche necessarie e, in questo caso, il solo limite è la fantasia di chi ci commissiona i progetti :D
- Riccardo





