不支持"跟随"轴时在XPath中获取以下兄弟

Tim*_*rse 4 sql-server xpath xquery

我试图在MS SQL Server上使用XQuery获取包含特定文本元素的段落之后的表的文本元素.问题是每当我使用轴"follow","follow-sibling"或"previous-sibling"时,我得到一个错误,说SQL Server不支持这个(我使用的是版本2008).因此,例如,我可以获得包含值为"blah"的文本节点的第一个段落节点:

//w:p[descendant::w:t = "blah"]
Run Code Online (Sandbox Code Playgroud)

我可以使用以下方法从表元素中获取文本:

//w:tbl//w:t/text()
Run Code Online (Sandbox Code Playgroud)

我没有看到任何方法可以强制查询只返回先前捕获的段落节点之后的第一个表元素,因为:

//w:tbl[following:://w:p//w:t = "blah"]//w:t/text()
Run Code Online (Sandbox Code Playgroud)

给出错误:"XQuery [Specification.document.query()]:不支持XQuery语法'follow'."

同样的:

//w:tbl[following-sibling::w:p[descendant::w:t = "blah"]]//w:t/text()
Run Code Online (Sandbox Code Playgroud)

提供"XQuery [Specification.document.query()]:不支持XQuery语法'follow-sibling'."

那是不对的,你们都知道!自从1999年AFAICT 1.0以来,XPath一直支持跟随和跟随兄弟姐妹,所以MS SQL Server似乎在标准合规性方面严重不足,但不管怎样,有没有人看到我可以在没有这些轴的情况下做到这一点?提前致谢!

Gun*_*her 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]
Run Code Online (Sandbox Code Playgroud)

或者,组合成单个表达式,

(//w:tbl//w:t/text()[. >> (//w:p[descendant::w:t = "blah"])[1]])[1]
Run Code Online (Sandbox Code Playgroud)