结合 XPaths / 无法将 xs:untypedAtomic 转换为节点

Combining XPaths / Cannot cast xs:untypedAtomic to node

处理一个包含 30k+ 文件的数据库,每个 Fruit 都在一个单独的文件中。xml 比这复杂一点:

<Fruit>
<Node1 name="papaya"><Childnode1 skincolor="YELLOW"></Childnode1></Node1>
<Node2 color="red"></Node2>
</Fruit>

<Fruit>
<Node1 name="apple"><Childnode1 skincolor="red"></Childnode1></Node1>
<Node2 color="Yellow"></Node2>
</Fruit>

<Fruit>
<Node1 name="banana"><Childnode1 skincolor="yELLOW"></Childnode1></Node1>
<Node2 color="yellow"></Node2>
</Fruit>

我在两个不同的属性中寻找相同的字符串:

/Fruit/Node1/Childnode1[matches(@skincolor,'yellow','i')/data(Fruit/Node1/@name) /Fruit/Node2[matches(@color,'yellow','i')]/data(Fruit/Node1/@name)

有些结果是重复的(在这个例子中只有香蕉),所以我尝试将两个路径重写成一个表达式:

/Fruit/Node1/Childnode1[matches(@skincolor,'yellow','i')/data(Fruit/@name) | /Fruit/Node2[matches(@color,'yellow','i')]/data(Fruit/@name)

出现错误:"Cannot cast xs:untypedAtomic to node()"。我的意图是将它们结合起来,然后只保留不同的值。 我是 XML/programming/SO 的新手,所以请像我 5 岁(正在学习编码)一样解释一下。

函数 fn:distinct-values 可用于:

distinct-values(/Fruit/(
  Node1/Childnode1[matches(@skincolor,'yellow','i')],
  Node2[matches(@color,'yellow','i')]
)/Fruit/@name)

联合运算符仅适用于 sets/sequences 个节点,但适用于调用 data() 函数的表达式 returns 个原子值序列。

反正你原来的路径表达式是错误的。如果我们添加缺少的“]”,则您有

/Fruit/Node1/Childnode1[matches(@skincolor,'yellow','i')]/data(Fruit/@name)

这不会 select 任何东西,因为 Fruit/@name 的上下文项是一个 Childnode1 元素,它没有 Fruit 子元素。应该是,例如

/Fruit[Node1/Childnode1[matches(@skincolor,'yellow','i')]]/data(@name)

要消除重复项,您需要考虑重复项的确切含义。如果您有两个不同的 Fruit 元素,都带有 @name="banana",您是否要将它们视为重复项?如果没有出现这种情况,那么您可以选择任何一种方式。如果重复是指 "both expressions select the same Fruit element",那么您可以使用联合运算符“|”消除重复项。如果你的意思是 "both expressions select Fruit elements with the same value for @name",那么你应该使用 distinct-values().