You can probably already do that just fine: ignore attribute nodes, and e.g.
{"menu": { "id": "file", "value": "File", "popup": { "menuitem": [ {"value": "New", "onclick": "CreateNewDoc()"}, {"value": "Open", "onclick": "OpenDoc()"}, {"value": "Close", "onclick": "CloseDoc()"} ] } }} /menu/popup/menuitem/*[last()]/preceding-sibling::*[1]/value
Maybe relax nodetypes so they can be pluggable per-language, but I'm not sure that's even useful or necessary.