XPath:查找属性节点(并且只有一个)
XPath是什么,可以只找到一个具有特定属性的节点(无论哪个节点)(实际上我感兴趣的是属性,而不是节点)。例如,在我的XML中,我有几个具有lang属性的标记。我知道它们都有相同的价值。我只想得到其中任何一个 现在,我这样做:XPath:查找属性节点(并且只有一个),xpath,Xpath,XPath是什么,可以只找到一个具有特定属性的节点(无论哪个节点)(实际上我感兴趣的是属性,而不是节点)。例如,在我的XML中,我有几个具有lang属性的标记。我知道它们都有相同的价值。我只想得到其中任何一个 现在,我这样做:/*[1][@lang]/@lang,但它似乎无法正常工作,原因不明 我的尝试让我实现了从所有@lang值('en-en…')的串联到什么都没有的事情,有时在我想要的东西之间,但不是在所有XML上 编辑: 实际上,/@lang[1]无法工作,因为函数position()是
/*[1][@lang]/@lang
,但它似乎无法正常工作,原因不明
我的尝试让我实现了从所有@lang值('en-en…')的串联到什么都没有的事情,有时在我想要的东西之间,但不是在所有XML上
编辑: 实际上,
/@lang[1]
无法工作,因为函数position()
是在对lang
属性进行测试之前调用的。所以它总是使用XML中找到的第一个元素。它在当时工作得最好,因为很多时候,lang属性位于根元素上。您尝试过这个吗
//@lang[1]
您可以看到一个示例。以下XPath似乎可以满足您的需要:
//*[@lang][1]/attribute::lang
经过更多的处理,以下是一个有效的解决方案:
(//@lang)[1]
需要用括号将
[1]
与属性名分开,否则position()
函数将应用于属性的父元素中(这是无用的,因为标记中只能有一个特定名称的属性:这就是为什么/@lang[2]
始终不选择任何内容) 不,我没有!乍一看好多了,我马上做个彻底的测试!谢谢。实际上它不能正常工作,它选择了它们的父元素中的所有第一个lang元素。@subtenant:不知道关于您的输入的任何其他信息,我认为这应该可以工作(这解释了为什么您的尝试不能工作)@阿泰姆·巴格的解决方案要优雅得多。@Tomalak:不幸的是,它没有,我也无法解释为什么。