XSLT: La funzione document()
Vi è mai capitato di voler trasformare N documenti in input in un solo output? A prima vista sembra che non sia possibile perché tutti i motori XSLT più diffusi sulla piazza lavorano con un solo XSLT e un solo XML come input.
In realtà già nelle puntate precedenti abbiamo visto che gli XSLT possono essere inclusi e importati, quindi possiamo avere N XSLT in input.
Ma anche gli XML, a patto che ve ne sia uno principale, possono essere N. Per ottenere questo risultato c'è la funzione document() che accetta come argomento un nodo che contenga una stringa (il path del file) o direttemante il path di un file da caricare come stringa.
Possibili sviluppi:
- Caricare dinamicamente degli XML esterni
- Caricare degli XML esterni dinamici generati da pagine ASPX, ASP, SQLXML, ecc. Per la funzione document non conta l'estensione ma il content-type e il fatto che l'XML sia well-formed. Nessuno quindi ci impedisce di leggere un ASPX esterno che restituisca text/xml well-formed
- Possiamo anche fare riferimento al nostro stesso sorgente XSLT invocando la funzione document senza argomenti. La regola prevede che document() senza argomenti restituisca sotto forma di nodeset il documento XSLT sorgente
Come si usa? Possiamo assegnare il risultato di document ad una variabile, o utilizzarlo direttamente in una value-of per esempio. Di solito è comodo associarlo ad una variabile e poi richiamarlo dove serve tramite il nome della variabile. Ecco un esempio:
http://www.devleap.com/Downloads/Blogs/Paolo/TutorialXSLT/Books.xml
http://www.devleap.com/Downloads/Blogs/Paolo/TutorialXSLT/Authors.xml
http://www.devleap.com/Downloads/Blogs/Paolo/TutorialXSLT/BooksWithAuthors.xslt
Notare la funzione current() per distinguere l'attributo @idAuthor del nodo author da quello del nodo di contesto corrente (cioè book).