Comment utiliser xsl variable dans xsl si
Je suis en train d'affecter une valeur à partir d'une feuille de style xsl variable d'un nouveau nœud dans mon fichier xml. Ce code fonctionne, mais ajoute un vide PROP/VAL nœud lorsque la valeur de "lbi:GetCoordinates(PVAL)" est vide:
<xsl:template match="PROP" mode="Geocode">
<PROP NAME="Geocode">
<PVAL>
<xsl:value-of select="lbi:GetCoordinates(PVAL)"/>
</PVAL>
</PROP>
</xsl:template>
Que je ne veux pas de nœuds vides, je suis en train de seulement ajouter le nouveau nœud uniquement lorsque la valeur de "lbi:GetCoordinates(PVAL)" n'est pas vide. L'approche que je suis en train d'assigner la valeur d'une variable et de tester cette variable, comme ci-dessous. Malheureusement, quand je fais cela je n'ai pas de nouvelles PROP nœuds, même lorsque lbi:GetCoordinates(PVAL) renvoie une valeur non vide.
<xsl:template match="PROP" mode="Geocode">
<xsl:variable name="coords" select="'lbi:GetCoordinates(PVAL)'"/>
<xsl:if test="not(string-length(coords) = 0)">
<PROP NAME="Geocode">
<PVAL>
<xsl:value-of select="coords"/>
</PVAL>
</PROP>
</xsl:if>
</xsl:template>
Quelqu'un peut me pointer dans la bonne direction, ou de suggérer une meilleure façon d'atteindre cet objectif?
La source xml est comme ceci:
<RECORD>
<PROP name="PostCode">
<PVAL>N11 1NN</PVAL>
</PROP>
</RECORD>
et le modèle est référencé ainsi:
<xsl:template match="RECORD">
<xsl:copy>
<xsl:apply-templates select="PROP[@NAME='PostCode']" mode="Geocode"/>
</xsl:copy>
La lbi:GetCoordinates() la méthode est externe .Net de l'assemblée ajouté comme un espace de noms xml.
À l'aide de cette approche fonctionne:
<xsl:template match="PROP[string-length(lbi:GetCoordinates(PVAL))>0]" mode="Geocode">
<PROP NAME="Geocode">
<PVAL>
<xsl:value-of select="lbi:GetCoordinates(PVAL)"/>
</PVAL>
</PROP>
Le problème maintenant est que la lbi:GetCoordinates méthode est appelée deux fois quand il ne doit être appelé qu'une seule fois, la source xml peut avoir plus de 100 000 éléments qui ont besoin de géocodage c'est donc non négligeable. Cela me suggère que le xsl:variable expression que j'ai utilisé précédemment est incorrecte et que la variable se termine toujours aussi vide.
lbi:GetCoordinates()
fonction renvoie -- merci de le préciser.OriginalL'auteur Jason | 2010-10-27
Vous devez vous connecter pour publier un commentaire.
C'est "presque" correct. Le seul problème est que les guillemets autour de
lbi:GetCoordinates(PVAL)
. Ces convertir la valeur de retour d'une fonction d'extension-- juste à la chaîne de l'expression qui appelle cette fonction. Comme la longueur de cette chaîne est évidemment plus grande que0
, le test sur la seconde ligne doit toujours être vrai.À partir de là, je suppose que le
lbi:GetCoordinates()
fonction renvoie une chaîne ou une valeur atomique (pas un nœud ou d'un node-set), parce que vous n'avez rien dit sur le type de retour de la fonction, mais c'est très important!Vous voulez (notez que les guillemets sont absent aujourd'hui!):
**Mais même cela est un peu maladroit.
Solution: Utiliser la puissance de XSLT modèle correspondent à des motifs et d'éviter la logique conditionnelle à l'intérieur du modèle tout à fait:
Ne pas s'inquiéter de la
lbi:GetCoordinates(PVAL)
fonction est appelée deux fois en raison d'une bonne optimisation de processeur XSLT ne faire qu'une seule fois. Vous pouvez toujours effectuer quelques tests pour voir si c'est le cas.Dans le pire des cas, si le processeur XSLT est muet, et appelle la fonction deux fois, puis utilisez le plus maladroit de code ci-dessus.
OriginalL'auteur Dimitre Novatchev
Essayez d'utiliser
string-length(coords) > 0
au lieu de votre état de santé .OriginalL'auteur Andrew Bezzub
si votre source xml ressemble un peu à ceci:
cela devrait faire l'affaire:
J'ai changé le match de la clause de filtre à l'avance, vous pourriez tout aussi bien essayer de changer votre si-déclaration de
not(string-length()=0)
àstring-length>0
Je n'ai pas un environnement de tester à l'instant, envisager d'inclure votre source xml, comme il est essentiel à la façon dont exactement le xslt doit être construit
Cette approche fonctionne, cependant le besoin d'appeler le lbi:GetCoordinates méthode deux fois à chaque fois n'est pas souhaitable.
OriginalL'auteur alfirin