XPath使用单个路径选择多个节点

时间:2018-07-25 15:07:44

标签: xml xpath orbeon xforms

假设我有一些看起来像这样的XML:

<Users>
  <User>Bob</User>
  <User>Stefania</User>
</Users>

如果我想选择第3行,我可以使用local-name()做到这一点的方法之一:

//*[local-name()='Users']/*[local-name()='User'][1]

我的问题是这个。是否可以使用一条语句选择多个节点?我尝试过:

//*[local-name()='Users/User'][1]

实际上,字符串将被变量替换。在XForms中,一个真实的示例如下所示:

<xf:var name="users" value="'Users"/>
<xf:var name="user" value="'User"/>
<xf:setvalue ref="//*[local-name()=$users/$user][1]" value="'Jim'"/>

但这不起作用。

我希望能够做到这一点:

<xf:var name="users" value="'Users"/>
<xf:var name="user" value="'User"/>
<xf:var name="myPath" value="'$users/$user'"/>
<xf:setvalue ref="//*[local-name()=$myPath][1]" value="'Jim'"/>

1 个答案:

答案 0 :(得分:3)

对于不在命名空间中的XML,

<Users>
  <User>Bob</User>
  <User>Stefania</User>
</Users>

此XPath,

//User

在单个XPath中选择多个节点(特别是元素),

  <User>Bob</User>
  <User>Stefania</User> 

根据要求。

不建议使用*[local-name()='User']构造破坏名称空间。如果您的XML实际上在命名空间中,请参见How does XPath deal with XML namespaces?