2010-12-29 30 views
19

He visto muchas publicaciones sobre esto ... pero no puedo, por mi vida, descubrir cuál es mi problema. Google Chrome simplemente muestra una página en blanco cuando intento transformar XML con XSL. Cuando veo la fuente, veo el XML sin formato. IE funciona.XSL no funciona en Google Chrome

tengo un documento XML que se parece a esto ...

<?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> 

... y luego el archivo XSL vinculados con la apariencia siguiente ...

<?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> 

Usted puede notar que el archivo XSL es en realidad un archivo PHP, pero funciona bien en otros navegadores y he intentado cambiarlo a .xsl para Chrome, pero no ayuda. ¿Qué estoy haciendo mal aquí?

+2

Es posible que desee ver: http://stackoverflow.com/questions/2981524/how-can-i-make-xslt-work-in-chrome – Cumbayah

Respuesta

14

La razón esto no funciona se debe a un problema de seguridad que Chrome ha abordado de una manera polémica [1][2][3][4], mediante el bloqueo de archivos XML de acceso a los archivos XSLT locales en el mismo directorio, mientras que los archivos HTML puede acceder a los archivos .CSS en el mismo directorio muy bien.

La justificación dada por el equipo de Chrome en 2008 fue this:


Imagínese este escenario:

  1. Recibe un mensaje de correo electrónico de un atacante que contiene una página web como un archivo adjunto, que descargaste

  2. Abra la página web ahora local en su navegador.

  3. La página web local crea una fuente cuya fuente es https://mail.google.com/mail/.

  4. Como ha iniciado sesión en Gmail, el marco carga los mensajes en su bandeja de entrada.

  5. La página web local lee los contenidos del marco utilizando JavaScript para acceder a los marcos [0] .document.documentElement.innerHTML. (Una página web de Internet no podría realizar este paso porque vendría de un origen que no es de Gmail, la política de origen mismo haría que la lectura fallara).

  6. La página web local coloca el contenido de su bandeja de entrada en a y envía los datos a través de un formulario POST al servidor web del atacante. Ahora el atacante tiene su bandeja de entrada, que puede ser útil para enviar spam o identificar el robo.

No hay nada que Gmail pueda hacer para defenderse de este ataque.


Estoy de acuerdo en que es molesto, como una solución que tienes 2 soluciones:

  1. intente ejecutar cromo con el interruptor --allow-file-access-from-files (no he probado esto mismo)

  2. Subirlo a un host, y todo estará bien.

+2

'- allow-file-access-from-files' no parece tener efecto en esta situación. – kynan

+0

No. -allow-file-access-from-files funciona perfectamente bien, pero asegúrese de que Chrome esté cerrado antes de ejecutar ese cambio. (Y por supuesto, su XSLT no puede tener ningún error). – David

+0

La decisión de Chrome es tonta. Si bien su [preocupación de seguridad] (https://code.google.com/p/chromium/issues/detail?id=4197#c14) tiene sentido, los archivos XML deberían poder cargar hojas de estilo XSL desde el mismo directorio, al igual que Los archivos HTML pueden cargar imágenes, hojas de estilo y scripts desde el mismo directorio. Hay un [problema que puede destacar] (https://code.google.com/p/chromium/issues/detail?id=47416) pero el equipo de desarrollo de Chrome ha prohibido nuevos comentarios, a pesar de que se quejaron de que no se puede cuantificar cuán mal los usuarios querían que se relajase el origen del archivo local. –

2

En la versión anterior de Chrome, si no muestra un documento adecuado con un vocabulario conocido (HTML, XHTML, SVG, etc.) no obtendrá una página renderizada.

En la versión moderna (tengo 10.0.612.3 dev instalado), se obtiene un documento XML sin estilo (con un error de análisis en su caso debido al resultado de más de un elemento raíz).

Solución: Imprima un documento HTML 4.0 adecuado (con todos los elementos obligatorios) o un documento XHTML 1.0 adecuado (también con el espacio de nombres correcto).

5

Cargando para alojar el problema de soves para mí. --La ​​solución de cambio de archivo "allow-file-access-from-files" no funcionó para mí.

0

El uso del modificador --allow-file-access-from-files hace que el truco para mí.

Estaba tratando de usar documentación fuera de línea desde el software instalado en mi sistema. IE mostró contenido al solo pedir permiso para habilitar los contenidos. Yo diría que esto se puede agregar a Chrome también sin sacrificar la seguridad.

0

Pude cargar el contenido xml en html en Chrome almacenando el xml como variable en javascript como se muestra a continuación.

<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

Cuestiones relacionadas