2009-09-27 18 views
10

Actualmente utilizo:Aplicar XSL a XML externo

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

Para vincular XSL a XML.

Si mi xml estaba aquí: www.externaldomain.com/rss.xml (Fuera de mi dominio) ¿cómo puedo obtener el XSL vinculado al XML?

¿Puedo apuntar el XSL a un archivo o un enlace?

Respuesta

2

No se puede lograr esto con xml "pura" + XSLT (*). Algún código externo necesitará identificar el xml y el xslt que deberían transformarlo.

Como parece que está transformando XML, voy a adivinar que está haciendo esto en el navegador web.

Puede hacerlo usando javascript, como demonstrated on w3schools. Sin embargo, las restricciones entre dominios se siguen aplicando si realiza solicitudes basadas en JavaScript (es decir, AJAX/XHR): si el servidor de origen no establece los encabezados CORS apropiados para permitir el acceso de JavaScript entre dominios, necesitará un proxy esa solicitud xml a través de su propio servidor.

(*): Mad's answer usa las referencias de entidades para incorporar astutamente xml externo en un documento que contiene. Definitivamente vale la pena intentarlo, pero tenga en cuenta que este tipo de inclusión basada en entidades se ha utilizado en varias filtraciones de información revelada, que es por lo que a menudo no está habilitado en el analizador xml (en particular, esto no debería ser capaz de subvertir CORS en un navegador). Tendrás que probarlo en tu situación.

+0

Esto no funciona, claramente pidió una solución cuando el xml es "Fuera de mi dominio". Javascript no hace dominio cruzado. La razón por la que votó a favor tu respuesta me supera, ya que está 100% equivocada y solo me di cuenta de que después de pasar 20 minutos tratando de hacer que ese ejemplo funcione ... De hecho, no puedo pensar en una sola vez cuando ese ejemplo sirva. solo funciona en archivos que están en el mismo dominio, que ya se pueden editar ... Así que, básicamente, lo que estoy tratando de decir es que eso está mal, y yo lo rechacé por ello. – Cody

+0

@Cody: lo siento por su frustración, actualizaré la respuesta para resaltar el requisito de CORS. Si el sitio de origen admite CORS, es probable que pueda hacer esto en javascript; de lo contrario, necesita utilizar el XML como proxy. –

+0

@Cody: solía ser un operador para una empresa y estábamos haciendo algunos procedimientos. Para saber si podemos continuar, podríamos usar un archivo XML que fue poblado por una organización asociada, pero no teníamos acceso a él y no era cuestión de pedirles que cambiaran algo en él. Estábamos esperando que estuvieran aquí algunas informaciones específicas y el archivo era muy largo. Nos encantaría mostrar solo el contenido de esas etiquetas específicas. Por lo tanto, nos encontramos en esta situación en la que es necesario aplicar XSL a un archivo XML externo. Saludos. –

3

Si está intentando ejecutar el XSLT dentro de .NET, puede usar fácilmente la clase XslCompiledTransform en .NET para lograr esto.

Si está intentando ejecutar esto, p. En la línea de comandos, hay un conjunto de herramientas que puede usar para aplicar un archivo XSLT a un archivo XML dado, por lo general, sin embargo, uno que esté en su disco duro local.

Véase p. Sitio web de Oleg Tkachenko para info on NXSLT y estas otras herramientas XSLT, o vea este CodeProject article para una extensión de shell de Windows para aplicar un XSLT a un archivo XML dado (en su disco duro local).

Espero que esto ayude un poco.

Marc

13

Puede crear un archivo XML local que incluya el contenido XML del archivo XML remoto a través de una referencia de entidad.

El ejemplo siguiente le proporcionará el contenido del archivo XML remoto dentro de un elemento de documento del contenedor.

Luego puede incluir una instrucción de procesamiento de hojas de estilo en su archivo XML local.

Sin embargo, puesto que el archivo local tiene un elemento de envoltura documento, es posible que tenga que apuntar a un "XSLT envoltorio" que utiliza xsl: import para importar el XSL.xsl original y apply-templates de partida con el contenido dentro del elemento contenedor elemento.

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE wrapper [ 
<!ENTITY content SYSTEM "http://stackoverflow.com/feeds"> 
]> 
<?xml-stylesheet type="text/xsl" href="XSL.xsl" ?> 
<wrapper> 
    &content; 
</wrapper> 
2

Se podría escribir un archivo XML local como envoltorio:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="XSL.xsl" ?> 
<wrapper Source="http://www.externaldomain.com/rss.xml"/> 

y extender la hoja de estilos para que entienda la envoltura:

<xsl:template match="wrapper"> 
    <xsl:apply-templates select="document(./@Source)"/> 
</xsl:template> 

no he probado con XML archivos a través de http, pero funciona con archivos XML locales que no quiero cambiar para incluir instrucciones de procesamiento xml-stylesheet. Funciona con Firefox, Opera e IE (7, no he probado otras versiones)

Cuestiones relacionadas