繁体   English   中英

在中间级别xquery中按元素本地名称订购xml

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM