I need to create an XPath expression that does the following:
- Returns the element inside of ‘NodeA’ by default
- Returns the element inside of ‘NodeB’ if it is not empty.
Here is some sample XML so that my target structure can be clearly seen (I am using MS InfoPath):
<?xml version="1.0" encoding="UTF-8"?><?mso-infoPathSolution solutionVersion="1.0.0.10" productVersion="14.0.0" PIVersion="1.0.0.0" href="file:///C:\Documents%20and%20Settings\Chris\Local%20Settings\Application%20Data\Microsoft\InfoPath\Designer3\9016384cab6148f6\manifest.xsf" ?><?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.3"?>
<my:myFields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2012-09-07T14:19:10" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" xml:lang="en-us">
<my:NodeASection>
<my:NodeA>2012-09-13</my:NodeA>
</my:NodeASection>
<my:NodeBSection>
<my:NodeBGroup>
<my:NodeB>2012-09-14</my:NodeB>
</my:NodeBGroup>
</my:NodeBSection>
</my:myFields>
This XPath expression can be used to evaluate NodeB for the existence of text: boolean(//my:NodeB[(text())])
I have heard of the “Becker Method” but I’m not sure how that applies when both nodes exist. I’m very new to XPath and appreciate any help that can be offered.
This XPath expression returns NodeB if it exists (and has text content) and NodeA in the other case:
If you want to get all sub-elements you can append
/*after the selected node, like this