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

时间:2010-07-13 15:43:04

标签: sql-server xpath xquery

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

//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()]:不支持XQuery语法'follow'。”

同样的:

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

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

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

1 个答案:

答案 0 :(得分: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]