假设我有一些看起来像这样的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'"/>
答案 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?。