【问题标题】:how to pass the element name in variable in xpath marklogic?如何在xpath marklogic中传递变量中的元素名称?
【发布时间】:2021-04-22 12:54:12
【问题描述】:

我的

let $doc :=
  <Test>
    <Abc>value of the element</Abc>

  </Test>

代码 -

for $i in $doc
let $x := 'Abc'
return $i/$x

result 预期的“元素的值”

请帮忙!!

TIA

【问题讨论】:

  • Abc 的值是可变的,还是静态的并且总是Abc?询问您是否需要更动态的方法来匹配元素名称,或者对于这种特殊情况,您是否只是想弄清楚如何选择 Abc 元素。
  • 元素名称是动态的。所以我需要从文档中读取元素名称并根据该元素名称及其值进行搜索。

标签: xml xpath marklogic


【解决方案1】:

在您的代码示例中,您让$x 变量并分配了一个字符串'Abc'。如果您想使用该字符串来查找具有该名称的元素,您可以调整您的 XPath 以选择子元素,然后在谓词过滤器中测试是 name() 还是 local-name()。如果您知道没有要处理的命名空间和命名空间前缀,则两者都可以工作,但最好使用local-name()

$doc/*[local-name()=$x] 

这将选择 Abc 元素,但如果您只想要值,则可以选择 text() 节点

for $i in $doc
let $x := 'Abc'
return $i/*[local-name()=$x]/text()

或应用string()函数:

for $i in $doc
let $x := 'Abc'
return $i/*[local-name()=$x]/string()

如果您知道它将是Abc 元素,那么您可以消除$x 变量:

for $i in $doc/Abc
return $i/string()

您可以完全消除 for 循环,只使用这样的 XPath 语句:

$doc/Abc/string()

【讨论】:

  • 好答案,我这边+1!
  • 由于您正在使用 XML,并且可能还使用命名空间:您可以将 $x 转换为具有适当命名空间的 xs:QName,并将 fn:name 值与 $x 进行比较,以便更好地匹配不可预测命名空间前缀。
  • 这里可以写代码吗,使用上面的doc?
  • 本地名称() eq $x。这确实有帮助,但我们还有其他方法吗?
猜你喜欢
  • 1970-01-01
  • 2019-03-11
  • 2021-03-14
  • 1970-01-01
  • 2013-10-02
  • 2011-12-20
  • 1970-01-01
  • 2019-03-03
  • 2014-05-07
相关资源
最近更新 更多