FrenchJericho
asked on
XPath to select nodes where child node is absent or empty?
In the following XML, I would like to select all employees without a middle name either because the node is empty or because the node is absent. In this example, the result would be Bill Gates and Larry Elison.
<Employees>
<Employee>
<FirstName>Bill</FirstName >
<MiddleName></MiddleName>
<LastName>Gates</LastName>
</Employee>
<Employee>
<FirstName>George</FirstNa me>
<MiddleName>W</MiddleName>
<LastName>Bush</LastName>
</Employee>
<Employee>
<FirstName>Larry</FirstNam e>
<LastName>Elison</LastName >
</Employee>
<Employees>
<Employee>
<FirstName>Bill</FirstName
<MiddleName></MiddleName>
<LastName>Gates</LastName>
</Employee>
<Employee>
<FirstName>George</FirstNa
<MiddleName>W</MiddleName>
<LastName>Bush</LastName>
</Employee>
<Employee>
<FirstName>Larry</FirstNam
<LastName>Elison</LastName
</Employee>
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
in fact, the following would be sufficient
//Employee[string-length(n ormalize-s pace(Middl eName)) = 0]
XML Document
============
<?xml version="1.0" encoding="iso-8859-1"?>
<Employees>
<Employee>
<FirstName>Bill</FirstName >
<MiddleName></MiddleName>
<LastName>Gates</LastName>
</Employee>
<Employee>
<FirstName>George</FirstNa me>
<MiddleName>W</MiddleName>
<LastName>Bush</LastName>
</Employee>
<Employee>
<FirstName>Larry</FirstNam e>
<LastName>Elison</LastName >
</Employee>
</Employees>
XSLT Document
-------------
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-m icrosoft-c om:xslt" version="1.0"
exclude-result-prefixes="m sxsl">
<xsl:output method="xml" encoding="iso-8859-1" indent="yes" />
<xsl:template match="/">
<Employees>
<xsl:copy-of select="//Employee[string- length(nor malize-spa ce(MiddleN ame)) = 0]" />
</Employees>
</xsl:template>
</xsl:stylesheet>
Output
========
<?xml version="1.0" encoding="iso-8859-1"?>
<Employees>
<Employee>
<FirstName>Bill</FirstName >
<MiddleName></MiddleName>
<LastName>Gates</LastName>
</Employee>
<Employee>
<FirstName>Larry</FirstNam e>
<LastName>Elison</LastName >
</Employee>
</Employees>
//Employee[string-length(n
XML Document
============
<?xml version="1.0" encoding="iso-8859-1"?>
<Employees>
<Employee>
<FirstName>Bill</FirstName
<MiddleName></MiddleName>
<LastName>Gates</LastName>
</Employee>
<Employee>
<FirstName>George</FirstNa
<MiddleName>W</MiddleName>
<LastName>Bush</LastName>
</Employee>
<Employee>
<FirstName>Larry</FirstNam
<LastName>Elison</LastName
</Employee>
</Employees>
XSLT Document
-------------
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-m
exclude-result-prefixes="m
<xsl:output method="xml" encoding="iso-8859-1" indent="yes" />
<xsl:template match="/">
<Employees>
<xsl:copy-of select="//Employee[string-
</Employees>
</xsl:template>
</xsl:stylesheet>
Output
========
<?xml version="1.0" encoding="iso-8859-1"?>
<Employees>
<Employee>
<FirstName>Bill</FirstName
<MiddleName></MiddleName>
<LastName>Gates</LastName>
</Employee>
<Employee>
<FirstName>Larry</FirstNam
<LastName>Elison</LastName
</Employee>
</Employees>
===============
//Employee[string-length(n