2014-07-10 2 views
0

J'essaie de substituer une valeur vide dans un fichier csv par un nombre.Utilisation de XSL Choix de la substitution d'une chaîne vide

Voici un exemple:

1111111,, 11222

J'ai donc essayé ceci:

<xsl:template match="/"> 

    <xsl:apply-templates select="//tr" /> 

</xsl:template> 

<xsl:template match="tr"> 
    <document> 
    <content name="title"> 
     <xsl:value-of select="td[1]/text()" /> 
     </content> 
    <content name="loanID"> 
     <xsl:value-of select="td[1]/text()" /> 
    </content> 
    <content name="cNumber"> 
     <xsl:variable name="score" select="td[2]/text()" /> 
     <xsl:choose> 
      <xsl:when test="$score=''"> 
     <xsl:value-of select="550" /> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="td[18]/text()" /> 
     </xsl:otherwise> 
    </xsl:choose> 
    </content> 
    </document> 
</xsl:template> 

Je reçois constamment une valeur nulle pour le nœud CNombre lorsque la valeur est vide dans la ligne , et je m'attends à ce que mon code remplace la valeur vide par '550'. Qu'est-ce que je fais mal? J'ai vérifié cette question here: et il semble que cela devrait fonctionner. J'utilise une application spéciale pour cela, mais je pense que la faute en incombe à moi.

Merci

+0

Quelle est l'entrée? Apparaît également que la sortie de votre feuille de style ne produit pas de fichier CSV. –

+0

'$ score' contient la valeur de' td [2] 'quand il est vide vous affichez' 550', quand il n'est pas vide, vous utilisez la valeur de 'td [18]', mais que faire si 'td [18] 'est vide? –

Répondre

2

Si l'élément td est vide, td/text() retourne une séquence vide/node-set, et lorsque vous comparez une séquence vide « », le résultat est faux. C'est l'une des raisons pour lesquelles beaucoup de gens déconseillent d'utiliser text(). Vous n'êtes pas intéressé ici dans le nœud de texte, vous êtes intéressé par la valeur de chaîne de l'élément td, et d'obtenir que vous devez utiliser

<xsl:variable name="score" select="string(td[2])" /> 

Vos autres utilisations du texte() le sont également, bien que vous Vous risquez seulement de voir un problème si votre entrée XML contient des commentaires ou des instructions de traitement. Mais vous devriez sortir de cette habitude de codage, et remplacer

<xsl:value-of select="td[1]/text()" /> 

par

<xsl:value-of select="td[1]" /> 

En règle générale, quand vous voyez /text() dans une expression XPath il est généralement faux.

+0

Je vois. Merci pour la reponse detaillee. –

Questions connexes