Sintassi per il condizionamento dei canali d'elemento al valore degli attributi.

Introduzione

C'è stato richiesto spesso di poter distinguere un canale di ricerca non sulla base del percorso XML che lo identifica bensì sulla base dal valore assunto da un attributo dell'elemento sul quale si sta concentrando la nostra attenzione.
In sostanza, quindi, ci è stato spesso richiesto di poter avere canali di ricerca diversi per lo stesso elemento a seconda del valore assunto da un attributo dell'elemento stesso. La stessa esigenza potrebbe essere estesa un po' a qualsiasi XPath ma per varie ragioni sarebbe al quanto complesso applicare quest'approccio al problema al Server eXtraWay.
Veniamo dunque ad identificare gli sviluppi che sono stati affrontati ed i risultati ottenuti.

Nota:
Si tenga conto che il seguente capitolo discute quello che si intende realizzare anche se ancora non completamente ralizzato. In coda al documento si esprime lo stato dell'arte e quante e quali funzionalità siano correntemente sviluppate e disponibili.

L'esigenza identificata e sintassi di configurazione

Come annunciato precedentemente l'esigenza principale consiste nel diversificare i canali di ricerca alimentati da un elemento sulla base del valore assunto da uno o più attributi dell'elemento stesso.
La condizione ottimale, inoltre, sarebbe di poter indicare un canale alternativo da utilizzare in also o in alias a seconda dei desideri.
Parimenti non è detto che tutti i valori assunti dal o dagli attributi condizionanti debbano causare l'alimentazione di un canale distinto.
Per soddisfare queste diverse esigenze è stata pensata una particolare sintassi di configurazione del file nomearchivio.conf.xml che permette di esprimere queste clausole ed identificare i canali di riferimento.
Vediamo di seguito come si esprime questa sintassi.

innanzitutto l'elemento key, precedentemente vuoto, può ora contenere un elemento k_choose. In presenza di tale elemento si identificano le condizioni che comportano l'uso di un canale alternativo.
L'elemento k_choose deve contenere uno o più elemento k_when, uno per ogni regola di condizionamento e può contenere un elemento k_otherwise che indica quale provvedimento prendere se nessuna delle condizioni espresse dagli elementi k_when è verificata.
Gli elementi di ambo i tipi sono vuoti e contengono alcuni attributi:

Il valore assunto dall'attributo test dell'elemento k_when è una stringa la cui composizione può essere riassunta in:

<nome_attributo> <operatore> <valore di confronto>

Questa sequenza può essere espressa più volte, per attributi e valori diversi e le diverse sequenze possono essere poste in AND o OR tra loro.
Gli operatori ammessi sono:

Vediamo ora un esempio che ci aiuti a comprendere. Di seguito un trancio di file di configurazione inerente la chiave rappresentata da "/document/varie".

   <key name="XML,/document/varie">
      <k_choose>
         <k_when test="@tipo = 'testo' OR @tipo = 'titolo'" mode="alias" key="XML,/document/testo"/>
         <k_when test="@tipo = 'note'" mode="alias" key="XML,/document/note"/>
         <k_when test="@tipo != 'abstract'" mode="also" key="XML,/document/altro"/>
         <k_otherwise mode="alias" key="XML,/document/abstract"/>
      </k_choose>
   </key>

In quest'esempio vediamo che l'analisi dell'attributi tipo dell'elemento varie ne condiziona l'interpretazione e l'uso del contenuto per alimentare diversi canali di ricerca. Ma andiamo con ordine. L'ordine in cui le regole sono indicate è infatti significativo.
Il nostro esempio ci dice che se l'attributo tipo assume il valore testo o il valore titolo si deve alimentare il canale XML,/document/testo al posto del canale preposto ovvro XML,/document/varie.
L'esempio ci dice inoltre che se il precedente test non dal'esito voluto, allora si procede a confrontare l'attributo test con il valore note. Se c'è corrispondenza sarà il canale XML,/document/note ad essere alimnetato al posto del canale principale.
Procedendo oltre sappiamo che se le precedenti regole non hanno dato riscontro e se l'attributo tipo ha un valore diverso da abstract, si alimenteranno due canali, ovvero il canale XML,/document/altro ed il canale principale, XML,/document/varie, in quanto è stata espressa la modalità also.
In fine la regola ci dice che per qualsiasi altro valore (che nel nostro caso vuol dire per il valore abstract) il canale ad essere alimentato al posto di quello di base sarò XML,/document/abstract.

Visto il formato delle ultime due regole lo stesso si poteva esprimere come:

   <key name="XML,/document/varie">
      <k_choose>
         <k_when test="@tipo = 'testo' OR @tipo = 'titolo'" mode="alias" key="XML,/document/testo"/>
         <k_when test="@tipo = 'note'" mode="alias" key="XML,/document/note"/>
         <k_when test="@tipo = 'abstract'" mode="alias" key="XML,/document/abstract"/>
         <k_otherwise mode="also" key="XML,/document/altro"/>
      </k_choose>
   </key>

Come abbiamo detto, l'elemento k_otherwise non è obbligatorio. Se viene omesso il canale standard verrà alimentato. La forma...

   <key name="XML,/document/varie">
      <k_choose>
         <k_when test="@tipo = 'testo' OR @tipo = 'titolo'" mode="alias" key="XML,/document/testo"/>
         <k_when test="@tipo = 'note'" mode="alias" key="XML,/document/note"/>
         <k_when test="@tipo = 'abstract'" mode="alias" key="XML,/document/abstract"/>
      </k_choose>
   </key>

...è probabilmente la più frequentemente utilizzata, ovvero la forma secondo la quale solo per particolari valori si alimentano canali alternativi.
Per contrasto, se non viene elencato nessun elemento k_when e ci si limita ad indicare l'elemento k_otherwise con modalità alias o also, si esprime, se pure in modo molto più complesso, quanto viene espresso semplicemente dagli attributi key_alias o key_also dell'elemento key.

Si ricorda, in fine, che come per le dichiarazioni di key_also e key_alias, tutti i canali espressi nell'attributo key devono essere dichiarati ciascuno in un proprio elemento key, non possono essere sottintesi.

Stato corrente dell'implementazione

All'atto della stesura (o successivo aggiornamento) di questo documento le funzioni precedentemente espresse non sono state implementate completamente.
Di seguito la cronistoria e lo stato d'avanzamento delle funzionalità.

Autore:
Tirabassi Roberto
Date
2005/11/23 12:38:45

Torna a Indice delle voci


HighWay/eXtraWay Project - Frequently Asked Questions (Doxygen 1.6.1)