RE: [xsl] test if node-set variable is empty

Subject: RE: [xsl] test if node-set variable is empty
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Tue, 14 Dec 2004 15:38:49 -0000
> How can I test if the variable $xsd_node was assigned a value?
> In some cases the node-set expression to fill this variable might copy
> nothing.
> 
> ...	
> <xsl:variable name="xsd_node">
>   <xsl:copy-of select="$xsd_doc//xs:element[@name = $name and
> count(child::node()) = 0]"/>
> </xsl:variable>

An xsl:variable that contains an xsl:copy-of as its only content looks very
strange. Why do you want to work with a copy of the data, rather than
working with the original? Your code would almost certainly work just as
well, and rather faster, if you selected the data without copying it:

<xsl:variable name="xsd_node" 
  select="$xsd_doc//xs:element[@name = $name and count(child::node()) =
0]"/>

(There might be legitimate reasons to create a copy, for example if you want
to use xsl:number to number the nodes as they appear in the new tree. But
I'd be surprised.)

The value of the variable is then a node-set, and you can test whether it is
an empty node-set using count($xsd_node)=0.

Your original variable is (in XSLT 1.0) a result-tree-fragment, and in XSLT
1.0 you can only examine its contents by using the xx:node-set() extension.
You would then want to test whether the root node of the RTF has any element
children:

xsl:if test="xx:node-set($xsd_node)/*"

Michael Kay
http://www.saxonica.com/

> 
> <xsl:if test="???">
> ...
> 
> Is there something like empty($xsd_node)?
> 
> Cheers,
> 
> R.

Current Thread