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

时间:2017-05-15 16:29:53

标签: xml xpath xquery basex

使用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)

出现错误:&#34;无法将xs:untypedAtomic转换为node()&#34;。我的意图是将它们结合起来,然后只保留不同的值。 我是XML / programming / SO的新手,所以请像我一样解释(并学习编码)。

2 个答案:

答案 0 :(得分:1)

函数fn:distinct-values可用于:

\J

答案 1 :(得分:0)

union运算符仅适用于节点的集合/序列,但调用data()函数的表达式返回原子值序列。

无论如何,您的原始路径表达式都是错误的。如果我们添加缺少的&#34;]&#34;,您有

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

,它不会选择任何内容,因为Fruit/@name的上下文项是Childnode1元素,它没有Fruit子元素。它应该是,例如

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

要消除重复,您需要考虑重复的确切含义。如果您有Fruit@name="banana"个元素,并且都是var joined = players.Join( playerPosition, p => new {p.FirstName, p.LastName, p.TeamName}, p => new {p.FirstName, p.LastName, p.TeamName}, (player, playerPos) => new {player, playerPos}); foreach (var pair in joined) pair.player.Position = pair.playerPos.Position; ,那么您是否希望将它们视为重复元素?如果情况没有出现,那么你可以采取任何一种方式。如果重复你的意思是&#34;两个表达式选择相同的Fruit元素&#34;,那么你可以使用union运算符&#34; |&#34;消除重复。如果你的意思是&#34;两个表达式都选择具有@ name&#34;相同值的Fruit元素,那么你应该使用distinct-values()。