带命名空间的文档路径表达式问题:无法获取EventType属性值
解决XQuery无法返回XML中EventType属性值的问题
这个问题的核心原因是你的XML文档使用了默认命名空间,而你的XQuery代码没有处理命名空间的绑定,导致节点匹配失败。
问题分析
你的XML根元素<Report>上定义了默认命名空间:
xmlns="VehicleExcelActivityReport"
这意味着文档中所有没有前缀的元素(比如OwnerList、Detail等)都属于这个命名空间。XQuery是严格区分命名空间的,如果你不声明并使用这个命名空间,XQuery引擎会认为你要查找的是没有命名空间的节点,自然匹配不到任何结果。
解决方案
方式1:显式绑定命名空间(推荐)
在XQuery开头声明命名空间,然后在节点路径中使用对应的前缀:
declare namespace veh = "VehicleExcelActivityReport"; for $x in /veh:Report/veh:OwnerList/veh:Owner_Collection/veh:Owner/veh:Activities/veh:Detail_Collection/veh:Detail return string($x/@EventType)
也可以简化为更紧凑的写法,省略for循环:
declare namespace veh = "VehicleExcelActivityReport"; /veh:Report/veh:OwnerList/veh:Owner_Collection/veh:Owner/veh:Activities/veh:Detail_Collection/veh:Detail/@EventType/string()
方式2:使用通配符匹配任意命名空间(临时应急)
如果不想显式绑定命名空间,可以用*:通配符匹配任意命名空间下的节点(不推荐在正式代码中使用,会降低代码可读性和匹配精准性):
for $x in /*:Report/*:OwnerList/*:Owner_Collection/*:Owner/*:Activities/*:Detail_Collection/*:Detail return string($x/@EventType)
预期结果
运行上述修改后的XQuery代码,你将会得到以下结果:
Ignition On Ignition Off
内容的提问来源于stack exchange,提问作者Pulpo Gris
相关产品推荐
相关产品推荐

