2014-10-09 1 views
0

일부 XML의 요소를 특정 레벨에서 요소의 이름으로 재주문하고 싶습니다. 그러나 약간의 문제가 있습니다. 여기에 내가 2008 R2 SQL 서버에서 변수 @XML에 사용하고 (함께 일하고 예제 XML 출력입니다 :중급 xquery에서 element local-name으로 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()'이 지원되지 않습니다. 위의 예에서와 같이 모든 상위 요소를 잃거나 순서에 전혀 영향을주지 않습니다 (위와 같습니다). 나는 SELECT @XML.query() 대신에 SET @XML.modify()을 사용해야한다고 생각합니다.하지만 그 결과는 더 적습니다.

나는 인터넷에서 많은 양의 trawling을 해왔지만, 내가 찾은 사이트 중 아무 것도 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> 

많은 감사 어떤 도움과 조언; 구문을보다 완벽하게 이해하기 위해 온라인에서 계속 검색 할 것입니다. 그러나 정확히 무엇을하고 있는지 알지만, 결과를 얻는 것이이 단계에서 진정한 향상이 될 것입니다!

감사합니다.

+0

몇 가지 질문 : 노드 순서가 중요한 이유는 무엇입니까? 어디에서 XML을 가져 왔으며 SQL Server에 삽입하기 전에 XML을 조작 할 수없는 이유가 무엇입니까? –

답변

1

<Car/> 요소 내의 요소를 재정렬하려면 두 개의 for 루프가 필요합니다. 다음은 작동합니다 :

for $car in //Car 
return <Car>{ 
    for $el in $car/* 
    order by local-name($el) 
    return $el 
}</Car> 

당신은 부모 요소를 재구성해야합니다, XQuery를 기존 노드를 수정할 수 없습니다로 (당신이에 대한 XQuery 업데이트 태어나 셨 것이며, 내가보기 엔 SQL 서버 2008가 지원하는 의심).

그러나 재주문이 어떻게 사용될 수 있는지 상상할 수는 없습니다. 이전과 완전히 똑같은 정보를 나타내고 각 XML 구문 분석기가 차이를 만들어서는 안됩니다. 나는 누군가가 단순히 노드를 재정렬하기를 원한다는 것을 결코 보지 못했다. 보통 노드의 동일한 값 (예 : 요소를 재정렬하여 가장 비싼 요소가 먼저 오도록)을 수행한다.

+0

좋아, 그럼 내가 뭘 요구했는지, 그래서 완벽 해 - 고마워! 그러나 나는 여러분의 의견을 들으며 출력을 위해 썼던 (아마도 지나치게 제한적인) xsd 스키마를 변경하는 것을 고려할 것입니다. 나는 또한 부모 요소를 잃지 않도록 소프트웨어의 최신 버전을 구하기 위해 회사를 설득하는 방법에 대해서도 살펴볼 것입니다. 당신이 제 질문에 대답했지만, 진정한 대답은 계속 진행하기 위해 다른 곳을 봐야한다는 것입니다. 조금도. 답변을 주셔서 감사합니다! –