You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写XQuery函数,通过动态XPath获取指定名称书籍的价格?

用XQuery实现动态XPath获取指定书籍价格

没问题,我来帮你搞定这个需求!核心思路是通过匹配名称为指定值的书籍节点,提取对应的价格——下面分步骤给你拆解实现方案:

1. 先明确示例XML数据源

假设你的目标XML结构是这样的(如果你的实际结构不同,只需调整XPath里的节点名称即可):

<books>
  <book>
    <title>The Great Gatsby</title>
    <price>12.99</price>
  </book>
  <book>
    <title>1984</title>
    <price>9.99</price>
  </book>
  <book>
    <title>To Kill a Mockingbird</title>
    <price>14.50</price>
  </book>
</books>

2. 编写XQuery函数

这里提供两种实现方式:一种是更安全的静态匹配(推荐),另一种是严格符合你需求的动态XPath求值:

方式一:静态谓词匹配(更安全,无注入风险)

这种方式不需要动态生成XPath,直接用参数作为匹配条件,性能和安全性都更优:

declare function local:get_book_price(
  $target_xml as node(),
  $book_name as xs:string
) as xs:decimal? {
  $target_xml//book[title = $book_name]/price/data()
};

方式二:动态XPath求值(满足动态XPath需求)

如果你确实需要动态构建XPath表达式,可以使用fn:evaluate()函数。注意:这种方式要警惕XPath注入风险,如果$book_name来自不可信输入,一定要做转义处理!

declare function local:get_book_price_dynamic(
  $target_xml as node(),
  $book_name as xs:string
) as xs:decimal? {
  -- 动态构建XPath时,转义书名里的双引号避免语法错误
  let $escaped_name := replace($book_name, '"', '&quot;')
  let $xpath := concat('//book[title = "', $escaped_name, '"]/price/data()')
  -- 在目标XML的上下文里执行动态XPath
  return fn:evaluate($xpath, $target_xml)
};

3. 调用示例

假设你把XML文档存在变量$books_doc里,调用方式如下:

-- 调用静态方式,获取《1984》的价格
local:get_book_price($books_doc, "1984")

-- 调用动态方式,获取《The Great Gatsby》的价格
local:get_book_price_dynamic($books_doc, "The Great Gatsby")

两种方式都会返回对应的价格数值(比如9.99或12.99)。

额外提示

  • 如果你的XML中书籍名称的节点不是title(比如是name),只需把XPath里的title改成对应的节点名即可。
  • 如果存在多本同名书籍,函数会返回所有匹配的价格(以序列形式);若只需返回第一本,可在表达式末尾加[1],比如$target_xml//book[title = $book_name]/price/data()[1]。

内容的提问来源于stack exchange,提问作者Bhuvana Purushotham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 06:17:37