Xml XPath多值搜索

Xml XPath多值搜索,xml,search,xpath,Xml,Search,Xpath,我有一个类似于: <user id="1"> <first_name>Max</first_name> <last_name>Mustermann</last_name> </user> 马克斯 马斯特曼 在搜索“Max Mustermann”时,如何创建XPath以获取用户id 谢谢诸如此类的东西 //user[first_name='Max' and last_name='Mustermann']/@id

我有一个类似于:

<user id="1">
  <first_name>Max</first_name>
  <last_name>Mustermann</last_name>
</user>

马克斯
马斯特曼
在搜索“Max Mustermann”时,如何创建XPath以获取用户id


谢谢诸如此类的东西

//user[first_name='Max' and last_name='Mustermann']/@id

如果该示例XML是准确的,包括缩进(即,在结束
标记和开始
标记之间有一个纯空白文本节点),那么您可以简单地使用
normalize-space()

这是因为XPath中元素节点的字符串值根据定义是其所有子代文本节点的串联,对该值应用
normalize space
,将去掉前导和尾随空格,并将任何内部运行的空格字符压缩为单个空格

如果XML不包含这些空白文本节点,则
user
元素的
normalize-space()
值将是
MaxMustermann
,因此您必须手动构造值进行比较:

//user[normalize-space(concat(first_name, ' ', last_name)) = 'Max Mustermann']/@id

我删除了我的答案,打开了另一个选项卡来测试我的表达式,此时您发布了:)我怀疑OP在开始时需要一个
/
,而不仅仅是一个
/
——如果OP的输入是完整的XML文档,那么这个表达式是正确的,但是不需要“搜索”如果输入只包含一个
用户
…这是一个公平的评论@Ian。。。更新-谢谢。我很喜欢你的解决方案——非常聪明,这是我从未考虑过的
//user[normalize-space(concat(first_name, ' ', last_name)) = 'Max Mustermann']/@id