I am trying to find an element from XML string based on an attribute and I have two situations:
//person[contains("name", "aa bb cc")]//phone
or
//person[contains("name", "aa cc")]//phone
I want to find both of these elements, is it possible to use wildcards for this case? I tried:
//person[contains("name", "aa*cc")]//phone
this doesn't work. Any suggestions?
The XML has this shape, and I want to get all the phone numbers:
<people>
<person>
<phone>315255414</phone>
<name>aa cc</name>
</person>
<person>
<phone>523525</phone>
<name>aa bb cc</name>
</person>
</people>
CodePudding user response:
After you updated the question I would suggest the following XPath expression to find the phone numbers:
//person[./*[starts-with(@name,'ab') and ends-with(@name, 'cc')]]/phone
In case name or phone can be a non-direct children of person the expression could be changed to the following:
//person[.//*[starts-with(@name,'ab') and ends-with(@name, 'cc')]]//phone
CodePudding user response:
Glob pattern wildcards (where * matches any characters), are not supported in XPath, but starting with XPath 2.0, full regular expressions (where .* matches zero or more characters) are supported.
XPath 2.0
This XPath,
//person[matches(name, '^aa.*cc$')]/phone
uses XPath 2.0's regular expression facilities to select the phone elements of those person elements whose name child element's string value starts with aa and ends with cc.
XPath 1.0
This XPath,
//person[starts-with(name, 'aa')][ends-with(name, 'cc')]/phone
does the same but only requires XPath 1.0.
