Come posso far funzionare XSLT in Chrome?


88

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

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

So che è possibile eseguire XSL lato client in Chrome, come ho visto esempi di esso, ma devo ancora essere in grado di replicare questo successo da solo

Che cosa sto facendo di sbagliato?


Sarebbe bello pubblicare la soluzione, quando lo sai. Non ho davvero usato Chrome per niente di serio, mi sembra un google-toy. Perché è necessario eseguire XSLT lato client?
Dimitre Novatchev

Io non. Ho solo pensato che sarebbe stato carino. E mi piacerebbe ancora sapere perché alcune cose funzionano su Chrome, ma la mia no. Oh, e per gli utenti di IE, scusa per l'atroce stile arcobaleno della pagina.
Eric,

12
Per me Chrome può fare la trasformazione solo quando si apre l'XML su http: //, non funziona quando si lavora tramite file: //, l'attributo xmlns non fa alcuna differenza per me.
Jaroslav Záruba

Questo bug è menzionato qui
Flavio Cysne

1
Il vero bug di Chrome per questo è a code.google.com/p/chromium/issues/detail?id=111905
Grant Peters,

Risposte:


116

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

Il vero motivo per cui non funziona è dovuto a problemi di sicurezza (cfr. Problema 4197 , problema 111905 ).

Immagina questo scenario:

  1. Si riceve un messaggio di posta elettronica da un utente malintenzionato contenente una pagina Web come allegato, che si scarica.

  2. Apri la pagina web now-local nel tuo browser.

  3. La pagina web locale crea una la <iframe>cui fonte è 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 frames[0].document.documentElement.innerHTML. (Una pagina web online non sarebbe in grado di eseguire questo passaggio perché proviene da un'origine non Gmail; il criterio della stessa origine impedirebbe la lettura.)

  6. La pagina web locale inserisce il contenuto della tua casella di posta in un <textarea>e invia i dati tramite un modulo POST al server web dell'aggressore. Ora l'attaccante ha la tua casella di posta , che può essere utile per lo spamming o il furto di identità.

Chrome sventa lo scenario precedente ponendo restrizioni sui file locali aperti utilizzando Chrome. Per superare queste limitazioni, abbiamo due soluzioni:

  1. Prova a eseguire Chrome con la --allow-file-access-from-files bandiera. Non l'ho testato da solo, ma se funziona, il tuo sistema sarà ora vulnerabile anche agli scenari del tipo sopra menzionato.

  2. Caricalo su un host e il problema è risolto.


2
Questo è vero, ma non è stata l'unica causa del problema. Ho seguito il rapporto "bug" per un po 'di tempo ormai. Tuttavia, non sono riuscito a farlo funzionare sul lato server senza l' xmlnsattributo. Questo potrebbe essere cambiato nelle versioni più recenti di Chrome.
Eric

4
@ Eric ok questa potrebbe non essere una risposta al tuo problema, ma è la risposta corretta alla tua domanda. a giudicare dai commenti dei visitatori di questa pagina, possiamo vedere che la risposta che era stata contrassegnata come risposta non risolve i loro problemi. (altrimenti perché dovrebbero guadare le altre 6 risposte per trovare una soluzione)
Pacerier

4
@ Pacerier: non è la risposta corretta alla mia domanda. La mia domanda era sul motivo per cui un paio di documenti ospitati sul mio server non venivano trasformati correttamente. Il problema della sicurezza, per quanto degno di nota, non è rilevante per questa particolare domanda.
Eric,

1
@Pacerier Thanks, --allow-file-access-from-filesfunziona bene.
Ibn Saeed

come impostarlo in macOS?
Pardeep Jain

14

Al momento della scrittura, c'era un bug in Chrome che richiedeva un xmlnsattributo per attivare il rendering:

<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" ... >

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 , le soluzioni menzionate --allow-file-access-from-filessono quelle che desideri


2
Buona scoperta! Riempito un bug per questo.
Mohamed Mansour

1
@Peter: dipende dal documento di input. Le specifiche XSLT sono abbastanza chiare qui e IE è troppo indulgente. Se l'input è XHTML valido, ha una dichiarazione dello spazio dei nomi. Per fare in modo che XSLT individui qualcosa in quel documento di input, è necessario definire lo spazio dei nomi. Tuttavia, non è necessario utilizzare lo spazio dei nomi predefinito (ma il più semplice).
Abel

10
@ Eric: dai un'occhiata alla mia risposta, senza offesa, ma la tua risposta è sbagliata.
Pacerier

4
Questa non è la risposta (né la soluzione, e il "..." è decisamente un po 'vago), quello di Pacerier è quello corretto.
RedGlyph

Questo non è corretto. non ha richiesto quella decelerazione. Chiede i numeri di versione.
UDID

7

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à nemmeno con IE.

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

Fare clic con il pulsante destro del mouse -> Proprietà -> Destinazione

inserisci qui la descrizione dell'immagine

Ecco un esempio di percorso completo con i flag che uso sulla mia macchina;

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

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


6

Ho avuto lo stesso problema su localhost. Corro in Internet alla ricerca della risposta e approvo che l'aggiunta di --allow-file-access-from-filesopere. Lavoro su Mac, quindi per me ho dovuto passare attraverso il terminale sudo /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-filese inserire la tua password (se ne hai una).

Un'altra piccola cosa: niente funzionerà se non aggiungi al tuo file .xml il riferimento al tuo file .xsl come segue <?xml-stylesheet type="text/xsl" href="<path to file>"?>. Un'altra piccola cosa di cui non mi sono reso conto immediatamente: dovresti aprire il tuo file .xml nel browser, non il .xsl.


4

Ebbene non funziona se il file XML (a partire dallo standard PI:

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

per fare riferimento al foglio di stile XSL) è servito come "application / xml". In tal caso, Chrome scaricherà comunque il foglio di stile XSL a cui si fa riferimento, ma non verrà visualizzato nulla, poiché cambierà silenziosamente i tipi di documento da "application / xml" in "Document" (! ??) e "text / xsl" in " Stylesheet "(! ??), quindi tenterà di eseguire il rendering del documento XML come se fosse un documento HTML (5), senza prima eseguire il suo processore XSLT. E nulla verrà visualizzato sullo schermo (il cui contenuto continuerà a mostrare la pagina precedente da cui si faceva riferimento alla pagina XML, e continuerà a far girare l'icona, come se il documento non fosse mai stato caricato completamente.

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

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

Per i file XML serviti come "text / xml" o "application / xml" e che non contengono una dichiarazione del foglio di stile XSL, Chrome dovrebbe comunque utilizzare un foglio di stile predefinito per renderlo come un albero DOM, o almeno come fonte di testo. Ma non lo fa, e anche qui 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 di eventi onLoad e iniettare 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 collegamenti guideranno a documenti XML con una dichiarazione XSL di base a un documento di foglio di stile XSL esistente, e puoi aspettare indefinitamente, pensando che i capitoli abbiano problemi da scaricare. Tutto quello che puoi fare per leggere la documentazione è aprire la console e leggere il codice sorgente nella scheda Risorse.


3

Per quanto posso dire, Chrome sta cercando l'intestazione

Tipo di contenuto: testo / xml

Allora funziona --- altre iterazioni sono fallite.

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


2

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

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


Vedi la mia risposta , l'ho risolto. Chrome sembra richiedere un xmlnsattributo.
Eric,

4
Non credo proprio. Per eseguire la trasformazione, Chrome non ha bisogno di impostare lo spazio dei nomi predefinito sullo spazio dei nomi XHTML. Per rendere XHTML ha bisogno di XHTML appropriato, ovviamente. Stai mescolando le cose.

Il sito a cui si fa riferimento sopra non è costruito con XML ma con XHTML. I due non sono esattamente la stessa cosa (entrambi sono XML ma uno è anche HTML e l'altro no).
jerseyboy

1

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


1

Quello che dice Eric è corretto.

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

versione = "1.0" xmlns: xsl = "http://www.w3.org/1999/XSL/Transform" xmlns = "http://www.w3.org/1999/xhtml"

Funziona bene con le cromature.


1

Ho iniziato a testarlo e mi sono imbattuto nel file locale / problema di sicurezza di Chrome. Una soluzione molto semplice è inserire il file XML e XSL, ad esempio, nella cartella pubblica di Dropbox e ottenere collegamenti a entrambi i file. Metti il ​​collegamento alla trasformazione XSL nell'intestazione XML. Usa il link XML in Chrome E FUNZIONA!


1

Dopo 8 anni la situazione è leggermente cambiata.

Non riesco ad aprire una nuova sessione di Google Chrome senza altri parametri e consenti lo schema "file:".

Su macOS faccio:

open -n -a "Google Chrome" --args \
    --disable-web-security \               # This disable all CORS and other security checks
    --user-data-dir=$HOME/fakeChromeDir    # This let you to force open a new Google Chrome session

Senza questi argomenti non sono in grado di testare il foglio di stile XSL in locale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.