使用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的新手,所以请像我一样解释(并学习编码)。
答案 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()。