Come posso far funzionare XSLT in chrome?

Ho qui un documento XML che viene servito con un file XSL corrispondente. La trasformazione è lasciata per essere eseguita lato client, senza JavaScript.

Funziona bene in IE (shock horror), ma in Google Chrome, mostra solo i nodes di testo del documento.

So che è ansible eseguire XSL lato client in Chrome, poiché ne ho visto alcuni esempi, ma sono ancora in grado di replicare personalmente questo successo

Che cosa sto facendo di sbagliato?

L’altra risposta di sotto di Eric è sbagliata. La dichiarazione dello spazio dei nomi che ha menzionato non ha nulla a che fare con il problema.

La vera ragione per cui non funziona è dovuta a problemi di sicurezza (vedere il numero 4197 , numero 111905 ).

Immagina questo scenario:

  1. Si riceve un messaggio e-mail da un utente malintenzionato che contiene una pagina Web come allegato, che si scarica.

  2. Apri la pagina web ora locale nel tuo browser.

  3. La pagina Web locale crea un cui origine è https://mail.google.com/mail/ .

  4. Poiché hai effettuato l’accesso a Gmail, il frame carica i messaggi nella tua casella di posta.

  5. La pagina Web locale legge il contenuto del frame utilizzando JavaScript per accedere ai frames[0].document.documentElement.innerHTML . (Una pagina Web online non sarebbe in grado di eseguire questo passaggio perché verrebbe da un’origine non Gmail, la politica dell’origine stessa causerebbe il fallimento della lettura.)

  6. La pagina Web locale posiziona il contenuto della tua casella di posta in una e invia i dati tramite un modulo POST al server web dell’attaccante. Ora l’autore dell’attacco ha la tua casella di posta , che può essere utile per lo spamming o per identificare il furto.

Chrome nasconde lo scenario precedente mettendo restrizioni sui file locali aperti tramite Chrome. Per superare queste restrizioni, abbiamo due soluzioni:

  1. Prova a eseguire Chrome con il --allow-file-access-from-files . Non l’ho testato personalmente, ma se funziona, il tuo sistema sarà anche vulnerabile a scenari del tipo sopra menzionato.

  2. Caricarlo su un host e risolvere il problema.

Al momento della scrittura, c’era un bug in chrome che richiedeva un attributo xmlns per triggersre il rendering:

  

Questo era il problema che stavo incontrando quando servivo il file xml da un server .


Se diversamente da me, stai visualizzando il file xml da un file:/// url , quindi le soluzioni che menzionano --allow-file-access-from-files sono quelle che vuoi

Ho avuto lo stesso problema su localhost. In giro per Internet alla ricerca della risposta e approvo che l’aggiunta di --allow-file-access-from-files funziona. Lavoro su Mac, quindi per me ho dovuto passare attraverso terminale sudo /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-files e inserire la password (se hai uno).

Un’altra piccola cosa: niente funzionerà a meno che non aggiungiate al vostro file .xml il riferimento al vostro file .xsl come segue < ?xml-stylesheet type="text/xsl" href=""?> . Un’altra piccola cosa che non ho realizzato immediatamente: dovresti aprire il tuo file .xml nel browser, non in .xsl.

Il problema basato su Chrome non riguarda lo spazio dei nomi xml che è xmlns="http://www.w3.org/1999/xhtml" . Senza l’attributo namesspace, non funzionerà neanche con IE.

A causa della limitazione della sicurezza, devi aggiungere il --allow-file-access-from-files quando avvii il chrome. Penso che gli utenti di linux / * nix possano farlo facilmente tramite il terminale ma per gli utenti di windows, devi aprire le proprietà del collegamento Chrome e aggiungerlo alla destinazione di destinazione come di seguito;

Clic con il tasto destro -> Proprietà -> Destinazione

inserisci la descrizione dell'immagine qui

Ecco un esempio di percorso completo con le bandiere che uso sulla mia macchina;

 "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files 

Spero di mostrare questo passo passo aiuterà gli utenti di Windows a risolvere il problema, ecco perché ho aggiunto questo post.

Beh, non funziona se il file XML (a partire dal PI standard:

 < ?xml-stylesheet type="text/xsl" href="..."?> 

per referenziare il foglio di stile XSL) è servito come “application / xml”. In tal caso, Chrome scaricherà comunque il foglio di stile XSL di riferimento, ma non verrà eseguito il rendering, in quanto cambierà automaticamente i tipi di documento da “application / xml” in “Document” (! ??) e “text / xsl” in ” Foglio di stile “(! ??), e quindi tenterà di rendere il documento XML come se fosse un documento HTML (5), senza eseguire prima il suo processore XSLT. Nulla verrà visualizzato sullo schermo (il cui contenuto continuerà a mostrare la pagina precedente a cui è stata fatta riferimento alla pagina XML e continuerà a ruotare l’icona, come se il documento non fosse mai stato caricato completamente.

Puoi utilizzare perfettamente la console di Chrome, che mostra che tutte le risorse sono state caricate, ma sono interpretate in modo errato.

Quindi sì, Chrome attualmente esegue il rendering solo di file XML (con la sua dichiarazione di foglio di stile XSL principale opzionale), solo se è servito come “text / xml”, ma non come “application / xml” come dovrebbe per XML di rendering lato client con un Dichiarazione XSL.

Per i file XML pubblicati come “text / xml” o “application / xml” e che non contengono una dichiarazione del foglio di stile XSL, Chrome deve comunque utilizzare un foglio di stile predefinito per renderlo come albero DOM o almeno come sorgente di testo. Ma non lo fa, e anche in questo caso tenta di renderlo come se fosse HTML, e bug immediatamente su molti script (incluso uno interno predefinito) che tentano di accedere a “document.body” per la gestione degli eventi onLoad e di iniettare qualche javascript gestore in esso.

Un esempio di sito che non funziona come previsto (la documentazione Common Lisp) in Chrome, ma funziona in IE che supporta XSLT lato client:

http://common-lisp.net/project/bknr/static/lmman/toc.html

Questa pagina di indice sopra è visualizzata correttamente, ma tutti i link guideranno i documenti XML con una dichiarazione XSL di base a un documento di foglio di stile XSL esistente e si può attendere indefinitamente, pensando che i capitoli abbiano problemi da scaricare. Tutto quello che puoi fare per leggere la docuemntation è aprire la console e leggere il codice sorgente nella scheda Risorse.

Per quanto posso dire, Chrome sta cercando l’intestazione

Content-Type: text / xml

Quindi funziona — altre iterazioni hanno fallito.

Assicurati che il tuo server web lo stia fornendo. Spiega anche perché non riesce per file: // URI xml files.

Controlla http://www.aranedabienesraices.com.ar

Questo sito è realizzato con XML / XSLT lato client. Funziona su IE6-7-8, FF, O, Safari e Chrome. Stai inviando intestazioni HTTP correttamente? Stai rispettando la politica della stessa origine?

Ho provato a mettere il file nel wwwroot . Quindi quando accedi alla pagina in Chrome, questo è l’indirizzo localhost / yourpage.xml .

Quello che Eric dice è corretto.

In xsl, per il tag xsl: stylesheet hanno i seguenti attributi

version = “1.0” xmlns: xsl = “http://www.w3.org/1999/XSL/Transform” xmlns = “http://www.w3.org/1999/xhtml”

Funziona bene in cromo.

Ho iniziato a testarlo e ho trovato il file locale / problema di sicurezza di Chrome. Una soluzione molto semplice è inserire il file XML e XSL nella cartella pubblica Dropbox e ottenere i collegamenti a entrambi i file. Inserisci il link alla trasformazione XSL nella testata XML. Utilizza il link XML in Chrome E FUNZIONA IT!