【问题标题】:XPath composition in XQueryXQuery 中的 XPath 组合
【发布时间】:2012-06-04 14:51:38
【问题描述】:

我有两个 XPath,f(x)g(y),还有一些 XML x

x = <example>
  <a>
    <number>1</number>
  </a>
  <b>
    <letter>A</letter>
  </b>
  <c>
    <number>2</number>
  </c>
</example>

f(x) = /example/*

g(y) = /number|/letter

如何在 XQuery 中编写 h(x) 以使 h(x) = g(f(x)) 对应任何 g(x)?我不知道g(x) 提前所以我不能修改它。如有必要,我可以修改f(x)。所有这些都需要在 XQuery 中进行,因为它是 Oracle 查询的一部分。

h(x) = g(f(x)) = $data/example/*...?

【问题讨论】:

  • “所有这些都需要在 XQuery 中发生”并不完全准确。 XQuery 是通过一些 hacky 字符串连接代码生成的,因此我可以执行任何我想要创建查询的字符串操作。我的意思是我不能做一些事情,比如抓取一组匹配的节点,然后将f(x) 应用于该组中的每个节点(除非我可以在 Oracle SQL 中这样做,但性能可能不太理想)。

标签: xpath xquery


【解决方案1】:

我可能对这个问题感到困惑,但如果我理解正确,那么答案是

let $f := FFFF return $f/(GGGG)

其中FFFF和GGGG是f(x)和g(y)对应的表达式

但我假设你的例子错了,当你写的时候

g(y) = /number|/letter

你是说

g(y) = number|letter

即相对选择而不是绝对选择。

【讨论】:

  • 相对选择是和否。结果应该是相对于 f 的结果,但是大多数 g 的 XPath 被写成好像 f 的结果是根元素。 let 的事情可能会奏效。
  • $f/... 与开始的类似。似乎我遇到的所有问题要么是 Oracle 的 XQuery 中的错误,要么是 Microsoft 的 XPath 中的错误,或者已经成为应用程序不可或缺的一部分并且无法轻易更改的编写不佳的代码。不幸的是,由于遗留代码的限制,这可能会通过哑字符串拆分和连接来解决。我会接受这个答案,因为如果我在 mxquery 中运行它确实有效。
【解决方案2】:

一种方法是连接字符串:

h(x, g_postfix) = '$data/example/*' + g_postfix

显然照顾到'|'这需要拆分、连接然后加入。

另一种方法是传递“g”函数的名称,然后创建动态 SQL 以在 f() 返回的节点列表上循环执行它。

【讨论】:

  • 拆分和连接适用于a|b,但当$data/c/(a|b) 正确时,"c/(a|b)" 变为$data/c/(a|$data/b)
  • 字符串操作绝对是一种不太可靠的方法。相反,将函数名作为字符串传递并执行动态 SQL 循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多