Question

How can I check if a node is empty in XSLT?

Answer and Explanation

In XSLT, you can check if a node is empty using various methods, depending on what you mean by "empty." Here are common scenarios and XSLT techniques to address them:

1. Checking for a node that does not exist:

- If a node might not exist at all in the XML source, use the boolean function not() in conjunction with the node selection. If a node does not exist, the select returns an empty node set, which has a boolean value of false. not(select-expression) will return true if the node doesn't exist.

- Example: To verify that a node <OptionalNode> is absent:

<xsl:if test="not(OptionalNode)">
  <!-- Node does not exist -->
  <xsl:text>The node <OptionalNode> does not exist.</xsl:text>
</xsl:if>

2. Checking if a node has no child nodes:

- Use the not(node()) test within the node to check if there are any child nodes.

- Example: To check if the node <ContainerNode> has no child elements:

<xsl:if test="not(ContainerNode/)">
  <!-- Node is empty -->
  <xsl:text>The <ContainerNode> has no child elements.</xsl:text>
</xsl:if>

3. Checking if a node has no text content (empty string):

- To check if a node has no text content or contains only whitespace, use the string() function and compare its length. The normalize-space() function is particularly useful for removing leading and trailing whitespaces and reducing multiple whitespaces into a single one before checking if the string is empty.

- Example: To check if the node <DataNode> has no text content:

<xsl:if test="not(normalize-space(DataNode))">
  <!-- Node is empty -->
  <xsl:text>The <DataNode> has no text content.</xsl:text>
</xsl:if>

4. Using a variable to store the node value for clearer logic:

- When checking multiple conditions or when the node selection is complex, it's good practice to first store the node's string value in a variable.

- Example:

<xsl:variable name="nodeValue" select="normalize-space(DataNode)" />
<xsl:if test="not($nodeValue)">
  <!-- Node is empty -->
  <xsl:text>The <DataNode> is empty or contains only whitespace.</xsl:text>
</xsl:if>

Choose the method that best suits your definition of “empty” for your specific XML structure. normalize-space() with not() is often the most robust for ensuring a node truly contains no useful content.

More questions