Grazie Lukeonweb, è stato il primo posto in cui ho cercato. Comunque qualche piccolo passo avanti l'ho fatto. Penso che potrebbe essere utile a tutti quello che ho trovato finora.
Ci sono alcune librerie che offrono la possibilità di trasformare xml con xsl:
Freja,
Ajaxlst e
Sarissa
Freja consente con poche righe di ottenere il risultato voluto:
Codice:
var data = getModel('documento.xml');
var display = getView('foglio.xsl');
display.render(data, document.getElementById('elemento'));
Simile è anche Ajaxslt, creata da Google, ma sembra abbandonata in favore proprio di Freja e Sarissa:
Codice:
var xml = docXml; //ottenibile sia da una richiesta xmlhttp sia da una stringa con la funzione xmlParse(stringaXml)
var xslt = foglioXsl; // come per docXml
var html = xsltProcess(xml, xslt);
document.getElementById('elemento').innerHTML = html;
Il problema è che entrambe possono elaborare un solo documento xml, mentre nella mia pagina ne ho quattro a cui applicare un unico foglio di stile
Questo è il codice usando Sarissa:
Codice:
var xmlHttp;
var xmlHttpXsl;
// richiamo i file xml e xsl con XMLHttpRequest e li assegno a xmlDoc e xslDoc
if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
xmlHttpXsl = new XMLHttpRequest();
} else if (window.ActiveXObject) {
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
xmlHttpXsl=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlHttp.open("GET", urlXml, false);
xmlHttp.send(null);
xmlHttpXsl.open("GET",urlXsl, false);
xmlHttpXsl.send(null);
var xmlDoc = xmlHttp1.responseXML;
var xslDoc = xmlHttpXsl.responseXML;
// creo un processore xslt e lo configuro con il mio foglio di stile
var processor = new XSLTProcessor();
processor.importStylesheet(xslDoc);
// creo un serializzatore per convertire l'oggeto xml in stringa
var serializza = new XMLSerializer();
// eseguo la trasformazione e inserisco il risultato nella pagina html
var resultDocument = processor.transformToDocument(xmlDoc);
var html = serializza.serializeToString(resultDocument);
document.getElementById('elemento').innerHTML = html;
eseguendo tante richieste xmlhttp quanti sono i file xml da caricare, ottengo quello che voglio sia su firefox che su opera.
Ma su ie ho l'errore:
"The stylesheet does not contain a document element. The stylesheet may be empty, or it may not be a well-formed XML document."
generato dall'istruzione: this.template.stylesheet = converted;
nella funzione: XSLTProcessor.prototype.importStylesheet = function(xslDoc).
Il foglio xsl non l'ho creato io, ma con gli altri browser funziona perfettamente.
Purtroppo ie è troppo diffuso per poterlo ignorare. Potete aiutarmi? Grazie
P.S. forse qualcuno potrebbe verificare il comportamento su ie7, in tal caso gli sarei grato se mi comunicasse l'esito