2009-09-27 13 views
10

Actuellement j'utilise:Appliquer au format XML externe XSL

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

Pour créer un lien vers XML XSL.

Si mon fichier XML était ici: www.externaldomain.com/rss.xml (en dehors de mon domaine) comment puis-je obtenir le XSL lié au XML? Puis-je pointer le XSL vers un fichier ou un lien?

Répondre

2

Vous ne pouvez pas y parvenir avec xml "pur" + xslt (*). Un code externe devra identifier le xml et le xslt qui devrait le transformer.

Puisque vous semblez transformer XML, je vais deviner que vous le faites dans le navigateur web.

Vous pouvez le faire en utilisant javascript, comme demonstrated on w3schools. Cependant, des restrictions inter-domaines s'appliquent toujours si vous effectuez des requêtes basées sur javascript (AJAX/XHR): si le serveur d'origine ne définit pas les en-têtes CORS appropriés pour autoriser l'accès javascript entre domaines, vous devrez cette requête xml via votre propre serveur.

(*): Mad's answer utilise des références d'entité pour incorporer intelligemment un fichier XML externe dans un document conteneur. Cela vaut vraiment la peine d'essayer, mais sachez que ce type d'inclusion basée sur les entités a été utilisé dans plusieurs fuites de divulgation d'informations, ce qui explique pourquoi il n'est souvent pas activé dans l'analyseur xml (en particulier, il ne doit pas subvertir CORS dans un navigateur). Vous devrez juste l'essayer dans votre situation.

+0

Cela ne fonctionnera pas, il a clairement demandé une solution lorsque le xml est "En dehors de mon domaine". Javascript ne fait pas de domaine croisé. Pourquoi il a surpassé votre réponse est au-delà de moi car il est clairement à 100% faux et je me suis rendu compte qu'après avoir passé 20 minutes à essayer de faire fonctionner cet exemple ... En fait, je ne peux pas penser à une seule fois cela ne fonctionne que sur les fichiers qui sont sur le même domaine, qui peuvent déjà être édités ... Donc, ce que j'essaie de dire est fondamentalement, c'est faux, et je vous ai downvoted pour cela. – Cody

+0

@Cody: Désolé pour votre frustration, je vais mettre à jour la réponse pour mettre en évidence l'exigence de CORS. Si le site d'origine prend en charge CORS, vous pouvez probablement le faire en javascript; sinon, vous devez utiliser le XML par procuration. –

+0

@Cody: Avant, j'étais opérateur pour une entreprise et nous faisions quelques procédures. Pour savoir si nous pouvons continuer, nous pourrions utiliser un fichier XML qui a été rempli par une organisation partenaire, mais nous n'y avons pas eu accès et il n'était pas question de leur demander de modifier quoi que ce soit. Nous attendions quelques informations spécifiques et le fichier était très long. Nous aimerions afficher uniquement le contenu de ces tags spécifiques. Par conséquent, nous sommes dans cette situation où il faut appliquer XSL à un fichier XML externe. Cordialement. –

3

Si vous essayez d'exécuter le XSLT dans .NET, vous pouvez facilement utiliser la classe XslCompiledTransform dans .NET pour y parvenir.

Si vous essayez d'exécuter ceci par exemple Dans la ligne de commande, vous pouvez utiliser un tas d'outils pour appliquer un fichier XSLT à un fichier XML donné, généralement celui qui se trouve sur votre disque dur local.

Voir par exemple. Le site Web d'Oleg Tkachenko pour info on NXSLT et ces autres outils XSLT, ou voir ce CodeProject article pour une extension de shell Windows pour appliquer un XSLT à un fichier XML donné (sur votre disque dur local).

Espérons que cela aide un peu.

Marc

13

Vous pouvez créer un fichier XML local qui inclut le contenu XML du fichier XML distant via une référence d'entité.

L'exemple ci-dessous vous donnera le contenu du fichier XML distant à l'intérieur d'un document wrapper.

Ensuite, vous pouvez inclure une instruction de traitement de feuille de style dans votre fichier XML local.

Cependant, étant donné que le fichier local a une enveloppe élément de document, vous devrez peut-être pointer vers un "XSLT wrapper" qui utilise xsl: import importer le XSL.xsl original et apply-templates départ avec le contenu à l'intérieur de l'élément wrapper.

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

Vous pouvez écrire un fichier xml local emballage:

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

Et prolonger votre feuille de style pour qu'il comprend l'emballage:

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

Je ne l'ai pas testé avec XML fichiers sur http, mais il fonctionne avec des fichiers XML locaux que je ne veux pas modifier pour inclure une instruction de traitement xml-stylesheet. Il fonctionne avec Firefox, Opera et IE (7, je n'ai pas essayé d'autres versions)