Compte tenu de la feuille de style XSLT XML DOM, une déclaration de variable élément rend la variable visible à tous les frères et sœurs et leurs descendants. Cela permet de processeurs XSLT pour analyser statiquement tout XPath contenant une référence à une variable pour voir si la variable existe; si la déclaration de la variable existe sur le précédent-frère ou un ancêtre de l'axe, la variable de référence est légal, sinon il ne l'est pas.
Noter que ceci est entièrement dépendante de la structure de la transformation XSLT, pas la structure du XML, c'est le traitement. 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, parce que cette maladie n'est pas légal dans XSLT. La sitauation que vous avez décrit dans votre commentaire - "L'idée est de définir un indicateur de la variable si quelque chose est de sortie et, plus tard, sur l'affichage d'un message différent si de rien n'était de sortie." - en fait, ce devrait entraîner une erreur de syntaxe. Par exemple, si vous faites quelque chose comme cela:
<xsl:iftest="some_condition"><!-- produce output here --><xsl:variablename="flag">true</xsl:variable></xsl:if><!-- time passes --><xsl:iftest="$flag='true'><!-- wouldn't it be nice? --></xsl:if>
vous obtiendrez une erreur de syntaxe: la deuxième xsl:if élément n'est ni une suite de la fratrie de la déclaration de la variable, ni l'un de leurs descendants.
Voici une technique que j'utilise une bonne quantité - ce qui produit la variable de sortie basé sur une variété de différentes conditions que vous ne voulez pas vérifier à nouveau plus tard:
<xsl:variablename="output"><xsl:iftest="$condition1='true'"><p>condition1 is true</p></xsl:if><xsl:iftest="$condition2='true'"><p>condition2 is true</p></xsl:if><xsl:iftest="$condition3='true'"><p>condition3 is true</p></xsl:if></xsl:variable><!-- we've produced the output, now let's actually *output* the output --><xsl:copy-ofselect="$output"/><!-- time passes --><xsl:iftest="normalize-space($output) != ''"><p>This only gets emitted if $output got set to some non-empty value.</p></xsl:if>
+1 pour la plus formelle explication de pourquoi c'est inutile et donc impossible. Cela semble être une bonne réponse à apporter vers le haut comme il fournit également une meilleure façon de faire les choses, si quelqu'un d'autre a la même question.
Poser cette question indique que vous n'avez pas saisir pleinement le point clé de XSLT. 🙂
C'est déclarative: rien ne peut exister, à moins que vous déclarez. Vous déclarez une variable, alors qu'il est là, vous n'avez pas, alors il n'est pas.
Pas une fois il n'y en aura point où vous devez vous demander, lors de l'encodage, si une variable existe.
XSLT a de strictes règles de portée, les variables n'existent que dans le cadre de leur élément parent, (et pas tous les éléments peuvent contenir des variables pour commencer). Une fois que vous quittez le parent de l'élément, la variable est allé.
Donc, sauf si vous spécifiez votre question/intention, la seule réponse valable est que la question est mal. Vous ne pouvez pas et n'ont pas besoin de vérifier si une variable existe au moment de l'exécution.
Tomalak est correct. Mais, si votre question était vraiment si la variable a été définie, alors quelque chose comme <xsl:if test="sting-longueur($mavar)"> pouvez tester une valeur. Ce teste si une variable a une valeur, qui est, à proprement parler, quelque chose de totalement différent. Dès que vous le pouvez écrire <xsl:if test="string-length($myVar)"> et votre feuille de style compile, alors la variable est définie (c'est à dire ", a déclaré") - quelle que soit sa valeur. Pour clarifier un peu les choses car c'est un peu plus mise en œuvre spécifique, par opposition à la question générique, la question actuelle dans le code, c'est afficher un message de quelque chose est manquant dans le XML fourni à partir de la feuille de style. L'idée est de définir un indicateur de la variable si quelque chose est de sortie et, plus tard, sur l'affichage d'un message différent si de rien n'était sortie. La seule raison pour laquelle un drapeau est venu est parce que la condition de test comme si quelque chose doit être affichée ou non, est niché entre une chaque et et un couple si les déclarations. Cependant, comme il s'avère, il semble que le fait qu'une variable d'indicateur est même venu... En fait, j'ai travaillé avec XSLT pour un couple d'années maintenant, donc je ne pense pas que c'est tellement une "regarder dans la mauvaise direction", comme le format d'origine de l'XML j'ai essayé de travailler avec a mauvais. Donc, pour l'instant, nous travaillons sur la réécriture de code XML qui a été généré et le XSLT est en train d'être extrêmement simple à écrire. Il semble aussi y avoir une odeur de code ici que si vous faites quelque chose dans XSLT qui semble trop compliqué, soit vous faites une erreur, ou le XML est structuré de mal. "C'est déclarative: rien ne peut exister que si vous déclarez qu'il" Dépend de qui tu veux dire par "Vous". À l'aide d'un système comme la Symphonie de la CMS params peut être généré pour vous d'accéder à vos modèles. Mais, dans certaines circonstances ne sont générés que lorsque certaines conditions sont remplies. Donc, en fait, il y a des situations dans lesquelles vous pourriez avoir besoin de vérifier l'existence d'un param avant de pouvoir faire quelque chose avec elle. "Poser cette question indique que vous n'avez pas saisir pleinement le point clé de XSLT." Ou peut-être qu'il y a des implémentations vous n'êtes pas au courant?
XSL variables sont strictement délimités, de sorte que vous ne pouvez pas y accéder dans des nœuds frère, seulement chez les enfants.
Si vous travaillez avec des params, vous pouvez utiliser un mondial <xsl:param />.
Je pense que cette réponse pourrait être la plus utile, mais vous êtes probablement ne pas obtenir des votes parce que vous avez juste mis un lien. Peut-être ajouter une petite explication? Pas pour la voix, mais un peu plus d'explications est une bonne idée. C'était une question pour google donc je l'ai posté une réponse de google. Deux points à soulever. L'une est que la FAQ pour le site dit rien de mal à demander Google-mesure des questions. Aussi, si vous examinez les autres réponses et quelques éléments de la discussion, les solutions qui ont été en revenant de hits sur Google a fini par être spécifique au moteur qui peut ou peut ne pas fonctionner en fonction de vos circonstances. Donc, cela signifie que d'autres développeurs qui viennent dans l'avenir seront aussi de voir que ces solutions peuvent ou peuvent ne pas fonctionner et ne sont pas certainement les meilleures pratiques. Ce sont des informations qui ne seraient pas connus du tout juste Googler quelque chose. Tous les im dire, c'est que j'ai copié la question directement dans google et c'était la première réponse. Ce post est maintenant le premier. Mais si vous ressentez le besoin de me marquer vers le bas pour vous aider à vous en sortir, alors que votre choix. Peut-être de lire la FAQ sur le marquage vers le bas "Si vous publiez quelque chose qui est hors sujet ou incorrect". Je crois que le lien est correct? Je baisse voté pour deux raisons, l'une est que votre réponse était juste un copier-coller d'un lien qui n'a pas vraiment d'expliquer quelque chose à quelqu'un de venir dans cette question de la même manière que les autres réponses ne. Cependant, plus important encore, le lien est d'expliquer comment vérifier si une variable déclarée a une valeur définie pour elle, ce qui n'est pas la même que la vérification pour voir si une variable a été déclarée à tous. Les autres réponses ont montré, ce n'est pas possible dans XSLT et si vous essayez de le faire, vous pourriez être en train de faire quelque chose de mal ou le XML que vous travaillez avec est mal formé.
Je ne pense pas que c'est possible, mais vous n'êtes pas probablement jamais besoin, parce que la variable n'existe pas, sauf si vous avez déclaré.
Comme il s'avère, en travaillant avec XSLT est un peu sur le côté impair comme il y a certaines choses qui ne sont pas pris en charge (par exemple pour les boucles) et des variables ne peut être définie qu'une seule fois et ne peut pas être mis à jour. En tant que tel, l'une des idées qui a été évoquée est l'aide de l'existence d'une variable comme un indicateur pour indiquer si certaines parties de la transformation ont exécuté ou non. Idéalement, vous pourriez être en mesure de le faire en vérifiant l'existence de quelque chose dans le XML en cours de traitement, mais parfois vous n'avez pas cette option. Fondamentalement la même chose je l'ai dit. @Rob: je crois que vous devez vous laisser aller à un tas de "traditionnel" schémas de pensée lorsque vous travaillez avec XSLT. Vous aurez également très susceptibles de ne pas avoir à vérifier si certaines parties de la transformation ont exécuté ou pas, parce que vous pouvez (déclarative) de trouver en vérifiant si elles exécuter ou non. Vous voulez savoir si l'article X a été créé? Il suffit de vérifier si le conditions pour la création de la section X sont là. Je suis conscient de cela et le fait que nous avons même eu à chercher un moyen de définition d'une variable d'indicateur est un signe qu'il ya quelque chose de mal avec le langage XML est généré. Il y a des circonstances où le "juste" dans Tomalak la dernière phrase est assez énorme. Par exemple, une transformation qui pourrait créer de 30 <p> éléments de, et qui doit émettre un <h2> élément d'abord si elle produit. Ce n'est pas seulement difficile, mais sujettes à l'erreur (et un entretien cauchemar) si vous cochez toutes les 30 conditions à déterminer si ou de ne pas émettre le <h2>. (Le modèle à la fin de mon post n'est pas sorti de nulle part.) Un paramètre peut être généré par le système (ala Symphonie CMS), un peu redondant réponse. C'est complètement mise en œuvre spécifique.
Si vous avez une variable, vous pouvez vérifier qu'il a quelque chose, ou qu'il "existe" en faisant quelque chose comme ce qui suit:
<xsl:choose><xsl:whentest="$myvar">
This variable exists!
</xsl:when><xsl:otherwise>
The variable doesn't exist :(
</xsl:otherwise></xsl:choose>
Que pour sa validité, je ne suis pas certain. Je vais vous dire, cependant, que je ne présente dans certains de nos systèmes au travail 😉
Firefox 3.5.2 renvoie une erreur si "myvar" n'est pas encore défini. Peut-être quelque chose comme ceci est de la mise en œuvre / XSLT version spécifique? Il me semble que XSLT 2.0 a bien des fonctions qui ne sont pas disponibles dans un grand nombre de moteurs XML. Je ne suis pas entièrement sûr. Personnellement, je ne pense pas qu'il devrait être fait. C'est une IE7 système aussi, vous ne savez pas si le navigateur provoque des effets sur elle. Cela ne veut pas tester l'existence d'une variable. Qui teste l'existence d'un élément nommé "myvar" sous le nœud de contexte.
Dans tout langage de programmation, vous aurez exactement le même comportement.
De Prendre C#. En essayant de faire référence à un non déclaré nom de la variable affiche un message d'erreur. C'est définitivement une erreur du développeur.
Pourquoi serait-il nécessaire que XSLT se comporte d'une manière différente?
Quant à la réflexion sur "avant" et "plus tard", ou sur une variable qui aurait plus d'une valeur pour indiquer, dans lequel "l'état" nous sommes, tout cela n'est pas permis dans XSLT, par définition, -- et plus exactement l'absence de ces "caractéristiques" est ce qui rend XSLT de nice et de ellegant langage fonctionnel, il est.
Je suis enclin à être en désaccord avec aucun langage de programmation ayant le même comportement que certaines langues va automatiquement créer et définir une valeur par défaut lors de la première rencontre d'un nom de variable. Cependant, je vois votre point de vue en ce qui concerne l'utilisation d'une telle "fonction" dans une langue pointant du doigt quelque chose qui cloche quelque part. Le problème que vous avez est que vous tentez d'accéder à une variable qui est hors de portée, en d'autres termes, ce qui n'existe pas du tout. Tous les langages de programmation générer une erreur dans cette situation. BTW, ça serait pas mal de fournir un échantillon (le moins possible, mais de travail) qui démontre votre problème. Alors beaucoup de gens vont être en mesure de vous aider. Que voulez-vous dire à l'intérieur de la conformé de l'environnement ou dans un interprétée environnement? Certains langages interprétés va réellement créer la variable en mémoire si vous y accéder sans déclaration préalable. Même si c'est pris en charge par certaines langage interprété, en aucune façon, c'est une bonne pratique. L'environnement d'exécution peut ne pas être en mesure de déduire le type de la variable ou pourrait en déduire de façon incorrecte. Source d'erreurs et d'inefficacité. Je suis d'accord avec vous en ce qui concerne ce n'est pas une bonne pratique, le plus souvent la nécessité pour elle est un signe que quelque chose a été écrit mal, d'une façon ou d'une autre. Aussi, si vous regardez une langue comme les anciennes versions de Visual Basic, et non pas à l'aide de l'Option Explicite a été considéré comme un moyen rapide pour introduire des bogues dans une application en raison de la mouche variables.
Compte tenu de la feuille de style XSLT XML DOM, une déclaration de variable élément rend la variable visible à tous les frères et sœurs et leurs descendants. Cela permet de processeurs XSLT pour analyser statiquement tout XPath contenant une référence à une variable pour voir si la variable existe; si la déclaration de la variable existe sur le précédent-frère ou un ancêtre de l'axe, la variable de référence est légal, sinon il ne l'est pas.
Noter que ceci est entièrement dépendante de la structure de la transformation XSLT, pas la structure du XML, c'est le traitement. 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, parce que cette maladie n'est pas légal dans XSLT. La sitauation que vous avez décrit dans votre commentaire - "L'idée est de définir un indicateur de la variable si quelque chose est de sortie et, plus tard, sur l'affichage d'un message différent si de rien n'était de sortie." - en fait, ce devrait entraîner une erreur de syntaxe. Par exemple, si vous faites quelque chose comme cela:
vous obtiendrez une erreur de syntaxe: la deuxième
xsl:if
élément n'est ni une suite de la fratrie de la déclaration de la variable, ni l'un de leurs descendants.Voici une technique que j'utilise une bonne quantité - ce qui produit la variable de sortie basé sur une variété de différentes conditions que vous ne voulez pas vérifier à nouveau plus tard:
Cela semble être une bonne réponse à apporter vers le haut comme il fournit également une meilleure façon de faire les choses, si quelqu'un d'autre a la même question.
OriginalL'auteur Robert Rossney
Poser cette question indique que vous n'avez pas saisir pleinement le point clé de XSLT. 🙂
C'est déclarative: rien ne peut exister, à moins que vous déclarez. Vous déclarez une variable, alors qu'il est là, vous n'avez pas, alors il n'est pas.
Pas une fois il n'y en aura point où vous devez vous demander, lors de l'encodage, si une variable existe.
XSLT a de strictes règles de portée, les variables n'existent que dans le cadre de leur élément parent, (et pas tous les éléments peuvent contenir des variables pour commencer). Une fois que vous quittez le parent de l'élément, la variable est allé.
Donc, sauf si vous spécifiez votre question/intention, la seule réponse valable est que la question est mal. Vous ne pouvez pas et n'ont pas besoin de vérifier si une variable existe au moment de l'exécution.
Ce teste si une variable a une valeur, qui est, à proprement parler, quelque chose de totalement différent. Dès que vous le pouvez écrire
<xsl:if test="string-length($myVar)">
et votre feuille de style compile, alors la variable est définie (c'est à dire ", a déclaré") - quelle que soit sa valeur.Pour clarifier un peu les choses car c'est un peu plus mise en œuvre spécifique, par opposition à la question générique, la question actuelle dans le code, c'est afficher un message de quelque chose est manquant dans le XML fourni à partir de la feuille de style. L'idée est de définir un indicateur de la variable si quelque chose est de sortie et, plus tard, sur l'affichage d'un message différent si de rien n'était sortie. La seule raison pour laquelle un drapeau est venu est parce que la condition de test comme si quelque chose doit être affichée ou non, est niché entre une chaque et et un couple si les déclarations. Cependant, comme il s'avère, il semble que le fait qu'une variable d'indicateur est même venu...
En fait, j'ai travaillé avec XSLT pour un couple d'années maintenant, donc je ne pense pas que c'est tellement une "regarder dans la mauvaise direction", comme le format d'origine de l'XML j'ai essayé de travailler avec a mauvais. Donc, pour l'instant, nous travaillons sur la réécriture de code XML qui a été généré et le XSLT est en train d'être extrêmement simple à écrire. Il semble aussi y avoir une odeur de code ici que si vous faites quelque chose dans XSLT qui semble trop compliqué, soit vous faites une erreur, ou le XML est structuré de mal.
"C'est déclarative: rien ne peut exister que si vous déclarez qu'il" Dépend de qui tu veux dire par "Vous". À l'aide d'un système comme la Symphonie de la CMS params peut être généré pour vous d'accéder à vos modèles. Mais, dans certaines circonstances ne sont générés que lorsque certaines conditions sont remplies. Donc, en fait, il y a des situations dans lesquelles vous pourriez avoir besoin de vérifier l'existence d'un param avant de pouvoir faire quelque chose avec elle. "Poser cette question indique que vous n'avez pas saisir pleinement le point clé de XSLT." Ou peut-être qu'il y a des implémentations vous n'êtes pas au courant?
OriginalL'auteur Tomalak
XSL variables sont strictement délimités, de sorte que vous ne pouvez pas y accéder dans des nœuds frère, seulement chez les enfants.
Si vous travaillez avec des params, vous pouvez utiliser un mondial
<xsl:param />
.Voir: http://www.stylusstudio.com/xsllist/199911/post30020.html
Pas pour la voix, mais un peu plus d'explications est une bonne idée. C'était une question pour google donc je l'ai posté une réponse de google.
Deux points à soulever. L'une est que la FAQ pour le site dit rien de mal à demander Google-mesure des questions. Aussi, si vous examinez les autres réponses et quelques éléments de la discussion, les solutions qui ont été en revenant de hits sur Google a fini par être spécifique au moteur qui peut ou peut ne pas fonctionner en fonction de vos circonstances. Donc, cela signifie que d'autres développeurs qui viennent dans l'avenir seront aussi de voir que ces solutions peuvent ou peuvent ne pas fonctionner et ne sont pas certainement les meilleures pratiques. Ce sont des informations qui ne seraient pas connus du tout juste Googler quelque chose.
Tous les im dire, c'est que j'ai copié la question directement dans google et c'était la première réponse. Ce post est maintenant le premier. Mais si vous ressentez le besoin de me marquer vers le bas pour vous aider à vous en sortir, alors que votre choix. Peut-être de lire la FAQ sur le marquage vers le bas "Si vous publiez quelque chose qui est hors sujet ou incorrect". Je crois que le lien est correct?
Je baisse voté pour deux raisons, l'une est que votre réponse était juste un copier-coller d'un lien qui n'a pas vraiment d'expliquer quelque chose à quelqu'un de venir dans cette question de la même manière que les autres réponses ne. Cependant, plus important encore, le lien est d'expliquer comment vérifier si une variable déclarée a une valeur définie pour elle, ce qui n'est pas la même que la vérification pour voir si une variable a été déclarée à tous. Les autres réponses ont montré, ce n'est pas possible dans XSLT et si vous essayez de le faire, vous pourriez être en train de faire quelque chose de mal ou le XML que vous travaillez avec est mal formé.
OriginalL'auteur StarSignLeo
Je ne pense pas que c'est possible, mais vous n'êtes pas probablement jamais besoin, parce que la variable n'existe pas, sauf si vous avez déclaré.
Fondamentalement la même chose je l'ai dit. @Rob: je crois que vous devez vous laisser aller à un tas de "traditionnel" schémas de pensée lorsque vous travaillez avec XSLT. Vous aurez également très susceptibles de ne pas avoir à vérifier si certaines parties de la transformation ont exécuté ou pas, parce que vous pouvez (déclarative) de trouver en vérifiant si elles exécuter ou non. Vous voulez savoir si l'article X a été créé? Il suffit de vérifier si le conditions pour la création de la section X sont là.
Je suis conscient de cela et le fait que nous avons même eu à chercher un moyen de définition d'une variable d'indicateur est un signe qu'il ya quelque chose de mal avec le langage XML est généré.
Il y a des circonstances où le "juste" dans Tomalak la dernière phrase est assez énorme. Par exemple, une transformation qui pourrait créer de 30 <p> éléments de, et qui doit émettre un <h2> élément d'abord si elle produit. Ce n'est pas seulement difficile, mais sujettes à l'erreur (et un entretien cauchemar) si vous cochez toutes les 30 conditions à déterminer si ou de ne pas émettre le <h2>. (Le modèle à la fin de mon post n'est pas sorti de nulle part.)
Un paramètre peut être généré par le système (ala Symphonie CMS), un peu redondant réponse. C'est complètement mise en œuvre spécifique.
OriginalL'auteur Michael Krelin - hacker
Si vous avez une variable, vous pouvez vérifier qu'il a quelque chose, ou qu'il "existe" en faisant quelque chose comme ce qui suit:
Que pour sa validité, je ne suis pas certain. Je vais vous dire, cependant, que je ne présente dans certains de nos systèmes au travail 😉
Je ne suis pas entièrement sûr. Personnellement, je ne pense pas qu'il devrait être fait. C'est une IE7 système aussi, vous ne savez pas si le navigateur provoque des effets sur elle.
Cela ne veut pas tester l'existence d'une variable. Qui teste l'existence d'un élément nommé "myvar" sous le nœud de contexte.
OriginalL'auteur Kezzer
Meilleur et rapide idée de vérifier walue si elle existe, est de vérifier la longueur
string()
. (stackoverflow.com/a/16049159/317052)OriginalL'auteur Karol
Dans tout langage de programmation, vous aurez exactement le même comportement.
De Prendre C#. En essayant de faire référence à un non déclaré nom de la variable affiche un message d'erreur. C'est définitivement une erreur du développeur.
Pourquoi serait-il nécessaire que XSLT se comporte d'une manière différente?
Quant à la réflexion sur "avant" et "plus tard", ou sur une variable qui aurait plus d'une valeur pour indiquer, dans lequel "l'état" nous sommes, tout cela n'est pas permis dans XSLT, par définition, -- et plus exactement l'absence de ces "caractéristiques" est ce qui rend XSLT de nice et de ellegant langage fonctionnel, il est.
Le problème que vous avez est que vous tentez d'accéder à une variable qui est hors de portée, en d'autres termes, ce qui n'existe pas du tout. Tous les langages de programmation générer une erreur dans cette situation. BTW, ça serait pas mal de fournir un échantillon (le moins possible, mais de travail) qui démontre votre problème. Alors beaucoup de gens vont être en mesure de vous aider.
Que voulez-vous dire à l'intérieur de la conformé de l'environnement ou dans un interprétée environnement? Certains langages interprétés va réellement créer la variable en mémoire si vous y accéder sans déclaration préalable.
Même si c'est pris en charge par certaines langage interprété, en aucune façon, c'est une bonne pratique. L'environnement d'exécution peut ne pas être en mesure de déduire le type de la variable ou pourrait en déduire de façon incorrecte. Source d'erreurs et d'inefficacité.
Je suis d'accord avec vous en ce qui concerne ce n'est pas une bonne pratique, le plus souvent la nécessité pour elle est un signe que quelque chose a été écrit mal, d'une façon ou d'une autre. Aussi, si vous regardez une langue comme les anciennes versions de Visual Basic, et non pas à l'aide de l'Option Explicite a été considéré comme un moyen rapide pour introduire des bogues dans une application en raison de la mouche variables.
OriginalL'auteur Dimitre Novatchev