2010-07-13 34 views
4

我想要在MS SQL Server上使用XQuery使用包含特定文本元素的段落後,獲取表格的文本元素。問題是每當我使用軸「跟隨」,「跟隨兄弟姐妹」或「前兄弟姐妹」,我得到一個錯誤,說這不支持SQL Server中(我使用版本2008)。因此,舉例來說,我可以得到包含其值是「嗒嗒」文本節點第一段節點:當「跟隨」軸不受支持時,在XPath中獲取以下兄弟:

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

我可以用得到的表元素的文本:

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

我看不出有什麼辦法可以強制查詢只返回下面的先前捕獲的段落節點,因爲第一個表元素:

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

給出了錯誤:「XQuery的[Specification.document.query()]: XQ uery語法'下面'不支持。「

與同爲:

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

給出 「的XQuery [Specification.document.query()]:XQuery的語法 '以下同胞' 不支持」。

這是不對的,你們都知道!自從1999年AFAICT 1.0以來,XPath支持以下和以下兄弟,所以MS SQL Server在標準符合性方面似乎嚴重不足,但無論哪種方式,有沒有人看到我可以在沒有這些軸的情況下做到這一點?提前致謝!

+0

你能後的XML? – Jagd 2010-07-13 16:10:54

+0

您的表達:'// w:tbl [following :: // w:p // w:t =「blah」] // w:t/text()'在語法上不是合法的XPAth表達式。這與「跟隨」無關。 – 2010-07-14 01:12:43

+0

關於: ''// w:tbl [before-sibling :: w:p [descendant :: w:t =「blah」]] // w:/ text()' 我知道這是有效的因爲它在.NET Framework中起作用。但不是在SQL Server中。在我看來,SQL服務器是不符合XPath的。 – TimeHorse 2010-07-15 14:31:03

回答

6

也可以使用節點比較運算符來評估XQuery中節點的文檔順序。

運算符>>適用於兩個節點,如果左側節點按照文檔順序跟隨右側節點,則返回true。爲了解決你的問題,你需要選擇第一個這樣的節點。

在以下代碼中,$blah$text是給定的表達式。返回的值是$text中的第一個節點,該節點位於$blah中的第一個節點之後。

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 2013-04-09 21:02:53