David Carlisle wrote:
Also you are classing attributes as non-empty content
but not namespace nodes so
<B foo=""/> is non empty but
<B xmlns:x="data:,hello"></B> is empty
Ah, good catch David.
Okay, I added
namespace::*
to the XPath that David provided, to take into account namespaces. Here is the new XPath:
empty((node(),@*,namespace::*))
Here are the results I got from running my XSLT program using the new XPath:
|
|
Is empty?
|
|
<B/>
|
true
|
|
<B></B>
|
true
|
|
<B>&null;</B>
|
true
|
|
<B> </B>
|
false
|
|
<B><!-- Hello, world
--></B>
|
false
|
|
<B><bad/></B>
|
false
|
|
<B>99</B>
|
false
|
|
<B x="10"/>
|
false
|
|
<B
xmlns:b="test"/>
|
false
|
Perfect!
Those results are from running SAXON in Oxygen XML.
John and David pointed out I might get different results with another parser. Specifically, another parser might discard comments
and the whitespace in <B> </B>. Such a parser would produce these results:
|
|
Is empty?
|
|
<B/>
|
true
|
|
<B></B>
|
true
|
|
<B>&null;</B>
|
true
|
|
<B>
</B>
|
true
|
|
<B><!-- Hello, world
--></B>
|
true
|
|
<B><bad/></B>
|
false
|
|
<B>99</B>
|
false
|
|
<B x="10"/>
|
false
|
|
<B
xmlns:b="test"/>
|
false
|
Is there any way to write an XPath expression that always produces the results shown in the first table, regardless of which parser
is used?
/Roger