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

如何编写XQuery查询符合条件图书并校验XML代码正确性

XML代码校验结果

你的XML整体层级逻辑和业务规则的对应关系是正确的,但存在2个会导致数据不符合规则、查询出错的问题:

  • 属性命名大小写不统一:XML是大小写敏感的语法,第一本图书下的版次节点使用大写开头的Year作为出版年份属性名,第二本图书下的版次节点使用小写开头的year作为同一定义的属性名,二者会被识别为完全不同的属性,不符合“版次以出版年份标识”的规则,需要统一命名,建议全部统一为year。
  • 副本唯一标识冲突:业务规则明确要求*Book_ID是每册副本的全局唯一标识*,你当前代码中《Database And Knowledge》1998版下,CS学院和EE学院馆藏的两册不同副本都使用了Book_ID="2222",违反唯一标识要求,需要给不同副本分配不重复的ID,例如EE学院馆藏的那册可改为Book_ID="2223"。

修正上述两个问题后,XML结构就完全符合给定业务规则了。

查询语句编写指导

你的需求核心筛选逻辑是:找到所有图书,其任意一个版次下,存在至少一个学院馆藏了2册及以上该版次的副本,最终返回对应图书名称。
主流XML查询使用XPath或XQuery实现,两种写法如下:

  • XPath 2.0+ 简洁写法,可直接在支持XPath2.0的解析工具中使用:
//book[exists(edition/Faculty[count(book_copy) ge 2])]/@Book_Name/string()

逻辑拆解:

  1. //book 匹配文档中所有图书节点
  2. 方括号内为筛选条件:判断当前图书下是否存在「版次节点下的学院节点,包含的副本节点数量≥2」的情况
  3. 最终提取符合条件的图书的Book_Name属性值,转为字符串返回
  • XQuery 写法,逻辑更直观,适合复杂场景扩展:
for $book in //book
where some $ed in $book/edition, $fac in $ed/Faculty
  satisfies count($fac/book_copy) >= 2
return $book/@Book_Name/data()

用你提供的原始XML(暂不修正问题)测试,符合条件的返回结果是Database Systems,因为该书1998版下CS学院共馆藏2册副本;另一本《Database And Knowledge》每个学院在对应版次下仅馆藏1册,不满足筛选条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:18:16