我想用元素的名称在一定程度上重新排序某些xml的所有元素,但我遇到了一点麻烦。下面是我正在使用的xml输出示例(我在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>
所有子元素的顺序(在上面的例子中),使它们的内容保持不变。在另一个question上提供了一些帮助之后,答案给出了一些想法,但这是一个错误,我完全改变了自己的想法,尝试了各种不同的方法:
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在转换后的理想情况(数字的顺序、BasicInfo和任何内容都更改为字母顺序):
<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>
任何帮助和建议都非常感谢;我将继续在网上搜索,以便更全面地了解语法和它到底在做什么,但是在这个阶段,获得某种结果将是一个真正的提升!
谢谢!
发布于 2014-10-09 06:09:12
您希望重新排序每个<Car/>
元素中的元素,因此需要两个for
循环。下列措施应能发挥作用:
for $car in //Car
return <Car>{
for $el in $car/*
order by local-name($el)
return $el
}</Car>
您必须重构父元素,因为XQuery不能修改现有节点(为此需要XQuery更新,我对Server 2008对此的支持非常怀疑)。
不过,请告诉我,我很难想象您的重新订购可能会被用于什么。它表示与以前完全相同的信息,每个XML解析器都不应该起作用。我从未见过有人想要简单地重新排序节点,通常是对节点的相同值进行重新排序(例如,重新排序元素,以便首先对最昂贵的元素进行排序)。
https://stackoverflow.com/questions/26279846
复制相似问题