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!
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 emptyAh, 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