2010-12-29 39 views
19

Ho visto un sacco di post tutto intorno a questo ... ma non posso, per la vita di me, capire qual è il mio problema! Google Chrome mostra solo una pagina vuota quando provo a trasformare XML con XSL. Quando visualizzo il codice sorgente, vedo l'XML non elaborato. IE funziona.XSL non funziona in Google Chrome

Ho un documento XML che assomiglia a questo ...

<?xml version="1.0" encoding="ISO-8859-1"?> 
<?xml-stylesheet type="text/xsl" href="http://localhost/xsl/listXSL.php"?> 
<links> 
    <link id="1" name="Google Home Page" url="http://www.google.com/" clicks="0" /> 
    <link id="2" name="Facebook" url="http://www.facebook.com/" clicks="1" /> 
    <link id="3" name="Gmail" url="http://gmail.com" clicks="2" /> 
</links> 

... e poi il file XSL linked che assomiglia a questo ...

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <xsl:for-each select="links/link"> 
    <a> 
     <xsl:attribute name="href"> 
      <xsl:value-of select="@url" /> 
     </xsl:attribute> 
     <xsl:value-of select="@name" /> 
    </a><br /> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

Si potrebbe notare che il file XSL è in realtà un file PHP, ma funziona bene con altri browser e ho provato a cambiarlo in .xsl per Chrome, ma non aiuta. Cosa sto facendo di sbagliato qui?

+2

Si consiglia di vedere: http://stackoverflow.com/questions/2981524/how-can-i-make-xslt-work-in-chrome – Cumbayah

risposta

14

La ragione per cui questo non funziona è dovuto ad un problema di sicurezza che Chrome ha affrontato in maniera controversa [1][2][3][4], bloccando i file XML di accedere ai file XSLT locali nella stessa directory, mentre i file HTML può accedere correttamente ai file .CSS nella stessa directory.

La giustificazione proposta dal team di Chrome nel 2008 è stato this:


Immaginate questo scenario:

  1. Viene visualizzato un messaggio di posta elettronica da un pirata informatico che contiene una pagina web come allegato, che scarichi.

  2. Si apre la pagina Web ora locale nel browser.

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

  4. Poiché si è effettuato l'accesso a Gmail, il frame carica i messaggi nella Posta in arrivo.

  5. La pagina Web locale legge il contenuto del frame utilizzando JavaScript per accedere ai frame [0] .document.documentElement.innerHTML. (Una pagina Web Internet 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 di la tua casella di posta in a 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.

Non c'è niente che Gmail possa fare per difendersi da questo attacco.


Sono d'accordo è fastidioso, come una correzione hai 2 soluzioni:

  1. provare a eseguire cromato con l'interruttore --allow-file-access-from-files (non ho provato io stesso)

  2. Caricarlo su un host e tutto andrà bene.

+2

'- allow-file-access-from-files' sembra non avere alcun effetto in questa situazione. – kynan

+0

No. -allow-file-access-from-files funziona perfettamente bene, ma assicurati che chrome sia chiuso prima di eseguire quell'interruttore. (E ovviamente, il tuo XSLT non può avere errori). – David

+0

La decisione di Chrome è sciocca. Anche se il loro [problema di sicurezza] (https://code.google.com/p/chromium/issues/detail?id=4197#c14) ha senso, i file XML dovrebbero essere in grado di caricare fogli di stile XSL dalla stessa directory, proprio come I file HTML possono caricare immagini, fogli di stile e script dalla stessa directory. C'è un [problema che puoi pubblicare] (https://code.google.com/p/chromium/issues/detail?id=47416) ma il team di sviluppo di Chrome ha bandito nuovi commenti su di esso, nonostante il fatto che si siano lamentati non è in grado di quantificare quanto gli utenti volessero che l'origine del file locale fosse rilassata. –

2

Nella versione precedente di Chrome, se non si restituisce un documento appropriato con un vocabolario noto (HTML, XHTML, SVG, ecc.) Non si ottiene una pagina sottoposta a rendering.

Nella versione moderna (ho installato 10.0.612.3 dev), si ottiene un documento XML senza stile (con un errore di analisi nel proprio caso a causa di più di un risultato dell'elemento radice).

Soluzione: restituire un documento HTML 4.0 corretto (con tutti gli elementi obbligatori) o un documento XHTML 1.0 corretto (anche con lo spazio dei nomi corretto).

5

Caricamento per ospitare il problema soves per me. La soluzione di switch --allow-file-access-from-files non ha funzionato per me.

0

Utilizzare l'opzione --allow-file-access-from-files fa il trucco per me.

Stavo cercando di utilizzare la documentazione offline dal software installato sul mio sistema. IE ha mostrato contenuti chiedendo solo il permesso di abilitare i contenuti. Direi che questo può essere aggiunto a Chrome anche senza sacrificare la sicurezza.

0

Sono stato in grado di caricare i contenuti xml in html in chrome memorizzando l'xml come variabile in javascript come mostrato di seguito.

<html> 
<head>testing</head> 

<body> 
<span id="num"></span> <span id="street"></span><br /> <span id="city"></span>, <span id="state"></span> <span id="zip"></span> 

<script> 
txt="<address>"+ 
"<street>Roble Ave</street>"+ 
    "<mtfcc>S1400</mtfcc>"+ 
    "<streetNumber>649</streetNumber>"+ 
    "<lat>37.45127</lat>"+ 
    "<lng>-122.18032</lng>"+ 
    "<distance>0.04</distance>"+ 
    "<postalcode>94025</postalcode>"+ 
    "<placename>Menlo Park</placename>"+ 
    "<adminCode2>081</adminCode2>"+ 
    "<adminName2>San Mateo</adminName2>"+ 
    "<adminCode1>CA</adminCode1>"+ 
    "<adminName1>California</adminName1>"+ 
    "<countryCode>US</countryCode>"+ 
"</address>"; 

if (window.DOMParser) 
    { 
    parser=new DOMParser(); 
    xmlDoc=parser.parseFromString(txt,"text/xml"); 
    } 
else // Internet Explorer 
    { 
    xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); 
    xmlDoc.async=false; 
    xmlDoc.loadXML(txt); 
    } 
document.getElementById("num").innerHTML= 
xmlDoc.getElementsByTagName("streetNumber")[0].childNodes[0].nodeValue; 
document.getElementById("street").innerHTML= 
xmlDoc.getElementsByTagName("street")[0].childNodes[0].nodeValue; 
document.getElementById("city").innerHTML= 
xmlDoc.getElementsByTagName("adminName2")[0].childNodes[0].nodeValue; 
document.getElementById("state").innerHTML= 
xmlDoc.getElementsByTagName("adminCode1")[0].childNodes[0].nodeValue; 
document.getElementById("zip").innerHTML= 
xmlDoc.getElementsByTagName("postalcode")[0].childNodes[0].nodeValue; 
</script> 
</body> 
</html> 

screenshot this answer helped me

Problemi correlati