如何编写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()
逻辑拆解:
//book匹配文档中所有图书节点- 方括号内为筛选条件:判断当前图书下是否存在「版次节点下的学院节点,包含的副本节点数量≥2」的情况
- 最终提取符合条件的图书的
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
相关产品推荐
相关产品推荐

