I have a PHP xpath query that works well for searching on a single node of my XML file. In simplified form, it looks like this: $url = 'myfile.xml'; $xml = simplexml_load_file($url); $xml->registerXPathNamespace("h", "https://library.example.ac.uk"); $found = $xml->xpath("//h:row[h:AUTHOR1[contains(.,'$search')]]"); ... The limitation is that it only finds AUTHOR1, but this XML library catalog file can contain multiple authors, like this sample entry: ```xml <?xml version="1.0" encoding="UTF-8"?> <table xmlns="https://library.example.ac.uk"> <row> <AUTHOR1>FABER, Adele</AUTHOR1> <AUTHOR2>MAZLISH, Elaine</AUTHOR2> <AUTHOR3></AUTHOR3> <AUTHOR4></AUTHOR4> <CALLNO>306.875 FAB</CALLNO> <COPIES>1</COPIES> <COPYNO>1.</COPYNO> <CUSTOM1>2011</CUSTOM1> <CUSTOM2></CUSTOM2> <EDITION></EDITION> <IBARCODE>856490.</IBARCODE> <ISBN>0380705273</ISBN> <PLACEPUBL>New York</PLACEPUBL> <PUBLISHER>Norton</PUBLISHER> <SUBJECT1>Child rearing</SUBJECT1> <SUBJECT2>Sibling rivalry</SUBJECT2> <SUBJECT3>Psychology</SUBJECT3> <SUBJECT4></SUBJECT4> <SUBJECT5></SUBJECT5> <TITLE>Siblings without rivalry : how to help your children live together so you can live too</TITLE> <WEBSITE/> <WORDCOUNT>0</WORDCOUNT> </row> </table> ``` My current search will only find "FABER", but I would like it also to be able to find "MAZLISH". I thought this would be a job for `starts-with`, but no syntax I have tried will work. I thought I could do something like: $xml->xpath("//h:row[h:[starts-with(name(), 'AUTHOR')[contains(... But I cannot get any variant of that to work. (The problem is not the nesting of quotes or brackets, I'm quite sure.) And I have tried both `name` and `local-name` for the `starts-with` bit. So! How to find hits on any of the `AUTHOR1`, `AUTHOR2`, `AUTHORn`... nodes?
The problem is more with how you select the nodes, `name()` will give you the name including the prefix, so you don't need to specify this as a separate part of the query (I think as it's the default prefix it is blank). So the value will be `AUTHOR1` etc. So change the way that you select the author nodes to just use `/*[starts-with(name(), 'AUTHOR')]`... $found = $xml->xpath("//h:row[*[starts-with(name(), 'AUTHOR')][contains(.,'$search')]]"); You can always add `/..` to the end of the XPath to backtrack to the row element: `//h:row/*[starts-with(name(), 'AUTHOR')][contains(.,'$search')]/..`