12
votes

Dans XSLT, comment testez-vous pour voir si une variable existe?

Lorsque vous utilisez XSLT, comment testez-vous pour voir si une variable scopée localement existe, ou est-ce même possible?


0 commentaires

6 Réponses :


0
votes

Je ne pense pas que ce soit possible, mais vous n'êtes pas susceptible d'en avoir besoin, car la variable n'existe que si vous ne l'avez pas déclaré.


6 commentaires

Comme il s'avère, fonctionnant avec XSLT est un peu étrange car il y a des choses qui ne sont pas prises en charge (par exemple pour les boucles) et les variables ne peuvent être définies qu'une seule fois et ne peuvent pas être mises à jour. En tant que telle, l'une des idées flottantes autour consiste à utiliser l'existence d'une variable comme drapeau pour indiquer si certaines parties de la transformation ont fonctionné ou non. Idéalement, vous pourriez simplement être capable de le faire en vérifiant l'existence de quelque chose dans le XML que vous traitez, mais parfois vous n'avez pas cette option.


@hacker: +1. Fondamentalement la même chose que j'ai dit. @ROB: Je crois que vous devez abandonner un tas de modèles de réflexion "traditionnels" lorsque vous travaillez avec XSLT. Vous n'aurez probablement probablement pas à vérifier si certaines parties de la transformation ont fonctionné ou non, car vous pouvez (déclara) (déclara) en vérifiant si elles serait courir ou non. Vous voulez savoir si la section X a été créée? Vérifiez simplement si les conditions pour la création de la section X sont là.


@Tomalak - Je suis conscient de cela et du fait que nous devions même rechercher un moyen de définir une variable de drapeau est un signe qu'il y a quelque chose qui ne va pas avec le XML généré.


Il y a des circonstances où le "juste" dans la dernière phrase de Tomalak est assez énorme. Par exemple, une transformation qui pourrait créer une création de 30 éléments

différents, et qui devrait émettre un élément

d'abord s'il produit n'importe lequel. Ceci n'est pas seulement difficile, mais également d'erreur (et un cauchemar de maintenance) si vous vérifiez les 30 conditions pour déterminer si vous souhaitez ou non émettre le

. (Le motif à la fin de mon message n'est pas sorti de nulle part.)


Un paramètre peut être généré par le système (ALA Symphony CMS), de sorte qu'une réponse redondante. C'est complètement la mise en œuvre spécifique.


@Nathanhornby, si nous allons aussi lire la question, nous remarquons "une variable localement scopée" là-bas.



2
votes

Les variables XSL sont strictement scopées, vous ne pouvez donc pas y accéder dans des nœuds de frère, uniquement chez les enfants. Si vous avez affaire à des paramètres, vous pouvez utiliser un global .

Voir: http://www.stysstudio.com/xsllist/199911/Post30020 .html


5 commentaires

Je pense que cette réponse pourrait être la plus utile, mais vous n'obtenez probablement pas de vote parce que vous venez de jeter un lien. Peut-être ajouter une petite explication?


Pas dedans pour les votes, mais une petite explication plus est une bonne idée. C'était une question pour Google, donc j'ai posté une réponse de Google.


@StarSingleo - deux points à élever cependant. L'une est que la FAQ du site indique que rien n'est faux de demander des questions Google-capables. De plus, si vous passez en revue les autres réponses et une partie de la discussion, les solutions qui revenaient des hits sur Google ont fini par être spécifique du moteur qui peuvent ou non fonctionner en fonction de votre situation. Cela signifie donc que d'autres développeurs qui viennent à l'avenir veilleront également à ce que ces solutions puissent ou non fonctionner et ne sont certainement pas les meilleures pratiques. Ceci est des informations qui ne seraient pas connues de quelque chose à googler.


Tous je dis est que j'ai copié la question directement dans Google et c'était la première réponse. Cet article est maintenant le premier. Mais si vous sentez que vous avez besoin de me marquer pour vous aider, alors que votre choix. Peut-être lu la FAQ sur le point de descendre "si vous postez quelque chose qui est hors tension ou qui est incorrect". Je crois que le lien est correct?


@Starsignleo - i Down vous a voté pour deux raisons, on est que votre réponse n'était qu'une pâte de copie d'un lien qui n'explique rien à quelqu'un qui vient dans cette question de la même manière que les autres réponses. Cependant, plus important encore, le lien explique comment vérifier si une variable déclarée a une valeur définie pour celui-ci, ce qui n'est pas identique à la vérification de la vue si une variable a été déclarée du tout. Comme les autres réponses ont montré, cela n'est pas possible dans XSLT et si vous essayez de le faire, vous pouvez faire quelque chose de mal ou que le XML que vous travaillez est mal formé.



-1
votes

Si vous avez une variable, vous pouvez vérifier que cela a quelque chose ou "existe" en faisant quelque chose comme ce qui suit: xxx

comme pour sa validité, je ne peux pas être certaine. Je vais vous dire cependant que je le fais dans certains de nos systèmes au travail;)


3 commentaires

Firefox 3.5.2 Retourne une erreur si "myvar" n'est pas déjà défini. Peut-être que quelque chose comme celui-ci est la mise en œuvre / la version XSLT spécifique? Je semble vous rappeler que XSLT 2.0 a des fonctions soignées qui ne sont pas disponibles dans de nombreux moteurs XML.


Je ne suis pas tout à fait sûr. Personnellement, je ne pense pas que cela devrait être fait. Il s'agit également d'un système IE7 uniquement, non sûr que le navigateur entraîne des effets.


Cela ne teste pas l'existence d'une variable. Ces tests pour l'existence d'un élément nommé "myvar" sous le nœud de contexte.



12
votes

Poser cette question indique que vous n'avez pas complètement saisi le point clé de XSLT. : -)

C'est déclaratif: rien ne peut exister que si vous ne le déclarez. Vous déclarez une variable, alors c'est là, vous ne le faites pas, alors ce n'est pas le cas.

Pas une fois, il y aura le point où vous devez vous demander, tout en codant, si une certaine variable existe.

XSLT a des règles de scopage strictes, des variables n'existent que dans le cadre de leur élément parent (et tous les éléments ne peuvent contenir de variables pour commencer). Une fois que vous quittez l'élément parent, la variable est partie.

Donc, à moins que vous spécifiez votre question / intention d'autres, la seule réponse valide est que la question est fausse. Vous ne pouvez pas et n'avez pas besoin de vérifier si une variable existe à l'heure d'exécution.


14 commentaires

Tomalak est correct. Mais si votre question était vraiment si la variable a été définie, alors quelque chose comme peut tester une valeur.


Cela teste si une variable a une valeur , qui est strictement parlant, quelque chose de totalement différent. Dès que vous pouvez écrire et votre stylesheet compile, la variable est définie (c.-à-d. "Déclaré" déclaré "), quelle que soit sa valeur .


Pour clarifier un peu les choses, car il s'agit d'un peu plus de mise en œuvre spécifique par opposition à la question générique, le problème actuel dans le code est affiché qu'un message de quelque chose est manquant à partir du XML fourni à partir de la feuille de style. L'idée est de définir une variable d'indicateur si quelque chose est sorti et plus loin d'affichage un message différent si rien n'était sorti. La seule raison pour laquelle un drapeau est arrivé est que la condition de test quant à si quelque chose est affiché ou non est imbriqué entre un pour chacun et un couple si des déclarations. Cependant, comme il s'avère, cela ressemble au fait qu'une variable de drapeau est même venue ...


... est plus un signe que le XML n'est pas bien conçu que toute autre chose. Cependant, je suis toujours curieux de voir s'il y a une "astuce" qui vous permet de le faire, semblable à la manière dont la méthode Muenchian est parfois utilisée.


Cela semble un peu comme si vous abordez le problème de la mauvaise fin (pensée procdurale!). Je suis sûr qu'il y a un moyen de faire ce que vous voulez. Qu'il s'agisse d'une manière belle / élégante dépend de ce que vous avez (INPUT XML) et de ce que vous voulez (format de sortie).


Le problème principal est que vous ne pouvez pas "définir un drapeau" et vérifier ailleurs. Le moment "drapeau" sort hors de portée c'est parti . (En plus, la méthode de Muenchian n'est guère une astuce de faire des choses comme ça - je ne sais pas pourquoi vous en parlez ici.)


@Tomalak - En fait, je travaille avec XSLT depuis quelques années maintenant, je ne pense pas que c'est tellement "le regarder de la mauvaise direction", comme le format original du XML que j'essayais de Travailler avec était juste faux . Donc, à l'heure actuelle, nous travaillons à la réécriture XML qui a été générée et que la XSLT est extrêmement simple à écrire. Il semble également y avoir une odeur de code ici dans ce que si vous faites quelque chose dans XSLT qui semble trop compliqué, soit vous le faites mal, soit le XML est structuré mal.


De plus, la raison pour laquelle je mentionne la méthode de Muenchian est que c'est un exemple d'une astuce soignée à utiliser avec XSLT et je me demande simplement s'il y a du tour pour le faire dans XSLT. Certes de ce que j'ai lu, il semble que cela ne soit pas soutenu par la conception, mais vous ne savez jamais ce que quelque chose pourrait être capable de faire.


Je vois. Pardonnez mon ignorance. ;-) La partie "odeur de code" a mon ack complet. Parfois, il est avantageux de penser que tout le monde, au lieu de marteler un petit peu qui refuse de travailler. Dans ce cas, je ne pense pas qu'il y ait un tour, car franchement, il n'y a pas de problème (ou je ne l'obtiens tout simplement pas). Pour moi, il sonne toujours comme un résoudrait probablement le problème.


@Tomalak - Cela pourrait avoir plus de sens si j'ai pu partager le code de production, mais je ne vois pas comment je peux. Toutefois, le résumé est multiple pour chaque affirmation qui boucle sur la plupart des nœuds du XML suivie d'un couple imbriqué si des déclarations qui ont navigué sur le document XML. Cependant, le XML est en cours de réécriture et le nouveau XSLT est beaucoup plus propre que ce qu'il y avait. Il semble donc que la réécriture du XML était la meilleure voie à suivre, car il est maintenant beaucoup plus facile de travailler avec celui qui était auparavant.


Parfois, je pense que


"C'est déclaratif: rien ne peut exister que si vous le déclarez" dépend de qui vous entendez par "vous". L'utilisation d'un système comme Symphony CMS params peut être généré pour accéder à vos modèles. Mais dans certaines circonstances ne sont générés que lorsque certaines conditions sont remplies. Donc, il y a en fait des situations dans lesquelles vous devrez peut-être vérifier l'existence d'un param avant de pouvoir faire n'importe quoi avec elle. "Demander cette question indique que vous n'avez pas complètement saisi le point clé de XSLT." Ou peut-être qu'il y a des implémentations dont vous ne savez pas?


@Nathan je vois ce que vous voulez dire, "implémentations dont vous ne savez pas" est quelque chose à garder à l'esprit. D'autre part, le cas principal d'utilisation de XSLT est axé sur les données / déclaratif (= correspondance de modèle), non impératif (= if / alors / / else), la question "a été définie" a été définie à ce que "a tendance à se découvrir que si vous 'Re le faire mal, mon imho.


@Tomalak - Oh je suis d'accord, c'est juste frustrant lorsque vous recherchez une réponse à une question seulement à rencontrer "ce n'est pas un problème", quand vous savez que parfois, c'est :) La logique peut ne pas être la Noyau du but de XSLT, mais ils mettent ces opérateurs là-bas pour une raison, c'est donc à peine une facette non prise en charge de la langue ou une demande inhabituelle. Vous pouvez affirmer que même dans PHP, vous devez savoir si une variable est définie ou non, mais nous avons toujours accès à Isset pour aider avec les cas où vous ne le faites pas. Mais TL; DR Je conviens que c'est une affaire d'utilisation spécifique et une pratique sans danger.



20
votes

Considérant la feuille de style XSLT en tant que XML DOM, un élément de déclaration variable rend la variable visible pour tous les frères et sœurs suivants et leurs descendants. Cela permet aux processeurs XSLT d'analyser statiquement n'importe quel XPath contenant une référence variable à voir si la variable existe; Si la déclaration de variable existe sur l'axe de la frère précédente ou de l'ancêtre, la référence variable est légale, sinon ce n'est pas le cas.

Notez que cela dépend entièrement de la structure du XSLT, et non de la structure du XML. Le processeur XSLT peut et doit produire une erreur si une expression XPath utilise une variable qui n'existe pas.

Il n'y a aucun moyen de vérifier cette condition à l'intérieur de XSLT car cette condition n'est pas légale dans XSLT. La situation que vous avez décrite dans votre commentaire - "L'idée est de définir une variable de drapeau si quelque chose est sorti et plus loin d'afficher un message différent si rien n'était sorti." - Il faut en réalité une erreur de syntaxe. Par exemple, si vous faites quelque chose comme ceci: xxx

Vous obtiendrez une erreur de syntaxe: le second xsl: si élément n'est ni un Fromage de la déclaration variable ni l'un de leurs descendants.

Voici une technique que j'utilise un montant équitable - cela produit une sortie variable basée sur une variété de conditions différentes que vous ne souhaitez pas vérifier plus tard: xxx


2 commentaires

+1 pour l'explication plus formelle de pourquoi ceci est inutile et donc impossible.


Cela semble être une bonne réponse à apporter au sommet car il offre également une meilleure façon de faire des choses si quelqu'un d'autre a la même question.



1
votes

meilleure et rapide idée de vérifier la valeur si elle existe consiste à vérifier la longueur informatique

<xsl:if test="string-length(value/to/check)=0">

</xsl:if>


0 commentaires