结合 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().
处理一个包含 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().