[英]Order xml by element local-name at mid level xquery
我想按元素的名称在某个级别上重新排列某些xml的所有元素,但是我有点麻烦。 这是我正在使用的示例xml输出(我正在SQL Server 2008 R2中的变量@XML中使用它:
<Data>
<Uns>
<Orgs>
<Prods>
<Prod>
<Something>1</Something>
<Cars>
<Car>
<Number>2013213</Number>
<BasicInfo>
<FirstName>Bob</FirstName>
<LastName>Monkhouse</LastName>
</BasicInfo>
<Anything>654</Anything>
</Car>
<Car>
<Number>2013213</Number>
<BasicInfo>
<FirstName>Bob</FirstName>
<LastName>Monkhouse</LastName>
</BasicInfo>
<Anything>654</Anything>
</Car>
</Cars>
</Prod>
<Prod>
<Cars>
<Car>
<Number>2013213</Number>
<BasicInfo>
<FirstName>Bob</FirstName>
<LastName>Monkhouse</LastName>
</BasicInfo>
<Anything>654</Anything>
</Car>
</Cars>
</Prod>
</Prods>
</Orgs>
</Uns>
</Data>
我想按字母顺序修改<Cars>
所有子元素的顺序(在上面的示例中),而其内容保持不变。 在另一个问题的帮助下(答案给出了一些想法,但有一个错误),我陷入了困境,尝试了各种变化:
select @XML.query('element Cars {
for $anything in //Car
order by local-name($anything/*[1])
return $anything
}')
但似乎没有任何效果。 我发现我经常遇到以下三个问题的组合:错误:“不支持XQuery语法'/ function()'”,丢失所有父元素(如上例所示),或者一切都发生在订单上(再次如上)。 我担心我应该使用SET @XML.modify()
而不是SELECT @XML.query()
,但这会导致更少的结果。
我已经在互联网上进行了大量的拖网捕捞,但是我发现的所有站点似乎都没有对xquery FLWOR语法有一个非常完整的了解-仅给出了具体且通常简单的示例,这些都没有帮助我找到为什么我的行为不如我所希望的解决方案。
这是上面的xml转换后理想的样子(将Number,BasicInfo和Anything的顺序更改为字母顺序):
<Data>
<Uns>
<Orgs>
<Prods>
<Prod>
<Something>1</Something>
<Cars>
<Car>
<Anything>654</Anything>
<BasicInfo>
<Name>Bob</Name>
</BasicInfo>
<Number>2013213</Number>
</Car>
<Car>
<Anything>654</Anything>
<BasicInfo>
<Name>Bob</Name>
</BasicInfo>
<Number>2013213</Number>
</Car>
</Cars>
</Prod>
<Prod>
<Cars>
<Car>
<Anything>654</Anything>
<BasicInfo>
<Name>Bob</Name>
</BasicInfo>
<Number>2013213</Number>
</Car>
</Cars>
</Prod>
</Prods>
</Orgs>
</Uns>
</Data>
任何帮助和建议,不胜感激; 我将继续在网上搜索以更全面地了解该语法及其确切功能,但是在此阶段获得某种结果将是真正的推动力!
谢谢!
您想对每个<Car/>
元素中的元素重新排序,因此将需要两个for
循环。 以下应该工作:
for $car in //Car
return <Car>{
for $el in $car/*
order by local-name($el)
return $el
}</Car>
您将不得不重新构造父元素,因为XQuery无法修改现有节点(您将需要对其进行XQuery更新,我非常怀疑SQL Server 2008是否支持该功能)。
但是,请注意,我几乎无法想象您的重新排序有什么用。 它表示与以前完全相同的信息,每个XML解析器都不应有所作为。 我从未见过有人想简单地对节点进行重新排序,通常对于相同值的节点(例如,对元素进行重新排序,以便最昂贵的元素排在第一位)就可以完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.