2010-07-13 2 views
4

MS SQL Server에서 XQuery를 사용하여 특정 텍스트 요소를 포함하는 단락 다음에 오는 테이블의 텍스트 요소를 가져 오려고합니다. 문제는 "following-sibling"또는 "previous-sibling"축 "following"을 사용할 때마다 SQL Server에서 지원되지 않는다는 오류가 발생합니다 (버전 2008 사용).축 "추종"이 지원되지 않는 경우 XPath에서 다음 형제 얻기

//w:p[descendant::w:t = "blah"] 

내가 사용하여 테이블 요소의 텍스트를 얻을 수 있습니다 :

//w:tbl//w:t/text() 

I을 그래서 예를 들면, 나는 값 "어쩌구"인 텍스트 노드를 포함하는 첫 번째 단락 노드를 얻을 수 있습니다 단지 이후 이전에 캡처 단락 노드를 다음 첫 번째 테이블 요소 반환에 내가 쿼리를 강제 할 수있는 방법이 표시되지 않는 :

//w:tbl[following:://w:p//w:t = "blah"]//w:t/text() 

하면 오류를 제공합니다 : "XQuery를 [Specification.document.query()] : XQ uery 구문 'following'은 지원되지 않습니다. "

그리고 대해 동일한 :

//w:tbl[following-sibling::w:p[descendant::w:t = "blah"]]//w:t/text() 

준다 "XQuery를 [Specification.document.query는() ''- 다음 형제 'XQuery에 구문을 지원하지 않습니다.'

그건 옳지 않습니다. XPath는 1999 년 AFAICT 1.0 이후로 다음과 같은 형제를 지원했습니다. 그래서 MS SQL Server는 표준 컴플라이언스 측면에서 심각한 결함이있는 것으로 보이지만 어느 것이 든 그 축없이이 작업을 수행 할 수있는 방법을 볼 수 있습니까? 미리 감사드립니다!

+0

당신은 XML을 게시 할 수 있습니까? – Jagd

+0

당신의 표현식 : // w : tbl [following :: // w : p // w : t = "blah"] // w : t/text()'는 구문 적으로 합법적 인 XPAth 표현식이 아닙니다. 이것은 "따르기"와는 아무런 관련이 없습니다. –

+0

어떨까요 : 'w : tbl [선행 형제 : : w : p] [자손 :: w : t = "어쩌구 저주]] // w :/텍스트()' 나는 그것이 유효하다는 것을 알고있다. .NET Framework에서 작동하기 때문입니다. 그러나 SQL Server에는 없습니다. SQL Server는 XPath 비준수입니다. – TimeHorse

답변

6

XQuery에서 노드의 문서 순서는 노드 비교 연산자를 사용하여 평가할 수도 있습니다.

연산자 >>은 두 노드에 적용되며 왼쪽 노드가 문서 순서에서 오른쪽 노드를 따라 가면 true를 반환합니다. 문제를 해결하려면 첫 번째 노드를 선택하십시오.

다음 코드에서 $blah$text이 주어진 표현식입니다. 반환 된 값은 $blah의 첫 번째 노드 다음에 오는 $text의 첫 번째 노드입니다. 하나의 표현으로 결합

let $blah := //w:p[descendant::w:t = "blah"] 
let $text := //w:tbl//w:t/text() 
return $text[. >> $blah[1]][1] 

또는,

(//w:tbl//w:t/text()[. >> (//w:p[descendant::w:t = "blah"])[1]])[1] 
+0

SQL Server를 더 이상 설치하지 않았지만 해결 방법을 신뢰할 수 있으므로 여기에 해결책이 있습니다! 당신의 도움을 주셔서 감사합니다! – TimeHorse

관련 문제