Thursday, May 5, 2011

xslt check if string is null or empty

how chan i check if a value is null or empty with xsl?

eg if categoryName is empty? im using a when choose construct

eg:

 <xsl:choose>
    <xsl:when test="categoryName !=null">
        <xsl:value-of select="categoryName " />
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="other" />
      </xsl:otherwise>
 </xsl:choose>
From stackoverflow
  • test="categoryName != ''"
    
    jelovirt : The detailed semantics of this test is: return true if there is at least one categoryName element whose string value is an empty string.
  • From here:

    to test if the value of a certain node is empty

    Depends what you mean by empty.

    • Contains no child nodes: not(node())
    • Contains no text content: not(string(.))
    • Contains no text other than whitespace: not(normalize-space(.))
    • Contains nothing except comments: not(node()[not(self::comment())])
  • Absent of any other information, I'll assume the following XML:

    <group>
        <item>
            <id>item 1</id>
            <CategoryName>blue</CategoryName>
        </item>
        <item>
            <id>item 2</id>
            <CategoryName></CategoryName>
        </item>
        <item>
            <id>item 3</id>
        </item>
        ...
    </group>
    

    A sample use case would look like:

    <xsl:for-each select="/group/item">
        <xsl:if test="CategoryName">
            <!-- will be instantiated for item #1 and item #2 -->
        </xsl:if>
        <xsl:if test="not(CategoryName)">
            <!-- will be instantiated for item #3 -->
        </xsl:if>
        <xsl:if test="CategoryName != ''">
            <!-- will be instantiated for item #1 -->
        </xsl:if>
        <xsl:if test="CategoryName = ''">
            <!-- will be instantiated for item #2 -->
        </xsl:if>
    </xsl:for-each>
    
    0xA3 : Nice to explain the different cases. However, your example is misleading as only the first `xsl:when` whose test evaluates to `true()` will be matched, i.e. case 3 and 4 will never match because already case 1 has matched.
    0xA3 : (continued) See http://www.w3.org/TR/xslt#section-Conditional-Processing-with-xsl:choose: "The content of the first, and only the first, xsl:when element whose test is true is instantiated."
    0xA3 : I changed the sample to something more meaningful.

0 comments:

Post a Comment