rally_point
rally_point

Reputation: 89

Using XSL Choose to Substitute Empty String

I'm trying to substitute an empty value in a csv file with a number.

Here's an example:

1111111,,11222

So I tried this:

<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>

I constantly get a null value for the cNumber node when the value is empty in the row, and I'm expecting my code to substitute the empty value for '550'. What am I doing wrong? I checked this question here: and it seems like this should work. I'm using a special application for this but my guess is the fault lies with me.

Thanks

Upvotes: 0

Views: 1581

Answers (1)

Michael Kay
Michael Kay

Reputation: 163549

If the td element is empty, then td/text() returns an empty sequence/node-set, and when you compare an empty sequence to '', the result is false. This is one of the reasons that many people advise against using text(). You're not interested here in the text node, you are interested in the string value of the td element, and to get that you should use

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

Your other uses of text() are also incorrect, though you're only likely to see a problem if your XML input contains comments or processing instructions. But you should get out of this coding habit, and replace

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

by

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

As a general rule, when you see /text() in an XPath expression it's usually wrong.

Upvotes: 2

Related Questions