Comment puis-je utiliser l'expression XPath « document ( '') » dans un XsltCompiledTransform .NET? Devrais-je?

StackOverflow https://stackoverflow.com/questions/4405622

  •  25-09-2019
  •  | 
  •  

Question

Je travaille actuellement sur un site Web où nous vous envoyons vers le bas XML + XSLT pour les clients qui le prennent en charge, pour économiser de la bande passante. Toutefois, si un client ne supporte pas, nous faisons la transformation sur le côté serveur, et envoyer le HTML résultant.

Dans mon XSLT, je voudrais utiliser un XPath très semblable:

document('')//xsl:variable[@name='test']

(pour retourner un ensemble de nœuds). Cela fonctionne très bien dans Firefox et IE, mais il ne fonctionne pas avec le XsltCompiledTransform- il me dit:

  

Cette opération est prise en charge par un URI relatif.

On dirait que l'erreur se produit dans XmlUrlResolver- Je sais que je peux passer une coutume de ceux, mais au-delà je ne suis pas vraiment pas sûr où je devrais regarder. Quelqu'un peut-il me donner des conseils à la façon dont je pourrais obtenir cette expression de travail? Je suis heureux d'utiliser des extensions de msxsl si besoin- le code ne sera visible sur le côté serveur, après tout.

Sur une plus générale est note- il commun à faire ce genre de requête XPath? Suis-je en train de tomber dans un piège XSLT géant, je ne suis pas au courant? Est-ce que ça va faire quelque chose de fou comme les navigateurs web lents jusqu'à l'arrêt?

Était-ce utile?

La solution

Initier la transformation à l'aide d'une instance de XsltSettings , de sorte que la fonction du document est autorisé .

Voici un exemple:

// Create the XsltSettings object with the document fn allowed.
XsltSettings settings = new XsltSettings(true,false);

// Create the XslCompiledTransform object and load the style sheet.
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("sort.xsl", settings, new XmlUrlResolver());

Votre autre question :

  

Sur une note- plus générale est-il commun   pour faire ce genre de requête XPath? Suis-je   tomber dans un piège XSLT géant Je suis   pas averti de? Est-ce que ça va faire   quelque chose de fou comme les navigateurs web lents   jusqu'à l'arrêt?

Le seul écueil est que cela peut provoquer la feuille de style XSLT à analysait à nouveau, ce qui est une opération relativement lente.

En savoir plus concernant est votre utilisation de l'abréviation de // qui est presque sûr de causer des problèmes de performance.

Il est préférable d'utiliser cette astuce uniquement pour les variables Globall puis utiliser cette expression:

document('')/*/xsl:variable[@name='test']

Enfin, au cas où vous n'êtes pas concernés par la perte de la portabilité entre les processeurs XSLT 1.0, il est plus efficace d'utiliser la fonction d'extension dépendante de la mise en œuvre de xxx:node-set() pour convertir le format RTF de la variable à un ensemble de nœuds réguliers. Ici, on pourrait utiliser exslt:node-set() à condition que le processeur XSLT implémente EXSLT. Cela permet d'atteindre encore un degré de portabilité relativement grande, parce que de nombreux processeurs XSLT, y compris exslt:node-set() support XslCompiledTransform.

Autres conseils

Je n'ai pas réussi à trouver une solution qui me permet d'utiliser le document ( « »), mais comme tout ce que je l'utilise pour est d'obtenir une variable d'évaluer un ensemble de nœuds, je réglage de la XML avant de traiter sur le côté serveur, pour changer:

document('')//xsl:variable[@name='test']

à:

msxsl:node-set($test)

Pas exactement la solution la plus élégante, mais cela fonctionne pour mes besoins.

Avez-vous essayé d'utiliser

document('')//xsl:variable[@name='test']

? C'est à dire. utiliser une chaîne de longueur nulle comme argument de document(), au lieu de passer aucun argument. Selon spec, document() doit avoir au moins un argument. Je suis surpris Firefox et IE sont laxistes à ce sujet. Mais cela pourrait expliquer pourquoi XsltCompiledTransform est malheureux.

Par contre, si XsltCompiledTransform ne soutiendra pas un URI il relatif, '' peut ne pas fonctionner (il est considéré comme un URI relatif). Il est possible que, depuis qu'il compile la transformation, ce n'est pas commode de donner accès à une arborescence de la feuille de style. « Un processeur XSLT n'a pas à supporter tous les schémas d'URI particulier. La documentation pour un processeur XSLT doit spécifier les schémas d'URI le processeur XSLT prend en charge ».

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top