【问题标题】:XPath select multiple nodes using a single pathXPath 使用单个路径选择多个节点
【发布时间】:2019-01-02 11:17:02
【问题描述】:

假设我有一些如下所示的 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'"/>

【问题讨论】:

  • “选择多个节点”的意思是要同时选择&lt;User&gt;Bob&lt;/User&gt;&lt;User&gt;Stefania&lt;/User&gt;
  • 不,我的意思是单个路径中有多个节点。 (不是 100% 节点是正确的术语)。请参阅我刚刚在最后添加的示例。
  • 简短的回答是,你不能写//*[local-name()=$users/$user]而不是//*[local-name()=$users]/*[local-name()=$user]。你只是想找到一个更短的语法,还是有更多的东西?
  • @avernet 不,除了找到更短的语法外,没有什么别的了。谢谢你。我开始认为你说的没有更短的语法是对的。
  • 知道了,然后我看不到任何更短的写//*[local-name()=$users]/*[local-name()=$user]的方法。对不起!

标签: xml xpath orbeon xforms


【解决方案1】:

对于不在命名空间中的 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?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 2014-10-10
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多