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.

Voir ma réponse pour une solution possible. Il est très important de savoir ce que l' lbi:GetCoordinates() fonction renvoie -- merci de le préciser.

OriginalL'auteur Jason | 2010-10-27