Получение следующего сиблинга в XPath, когда ось" following " не поддерживается


Я пытаюсь получить текстовые элементы таблицы, которая следует за абзацем, содержащим определенный текстовый элемент, используя XQuery на MS SQL Server. Проблема в том, что всякий раз, когда я использую оси "following", "following-sibling" или "previous-sibling", я получаю ошибку, говорящую, что это не поддерживается в SQL Server (я использую версию 2008). Так, например, я могу получить первый узел абзаца, содержащий текстовый узел, значение которого равно "бла":

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

И я могу получить текст из элемента таблицы использование:

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

Я не вижу способа заставить запрос возвращать только первый элемент таблицы, следующий за ранее захваченным узлом абзаца, так как:

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

Выдает ошибку: "XQuery [спецификация.документ.query ()]: синтаксис XQuery 'following' не поддерживается."

И то же самое для:

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

Дает " XQuery [Спецификация.документ.query ()]: синтаксис XQuery 'following-sibling' не поддерживается."

Это неправильно, вы все знаете! XPath имеет поддерживается following и following-sibling начиная с версии 1.0 еще в 1999 году AFAICT, так что MS SQL Server, похоже, сильно несовершенен с точки зрения соответствия стандартам, но в любом случае, кто-нибудь видит способ, которым я могу сделать это без этих осей? Заранее спасибо!

1 4

1 ответ:

Порядок расположения узлов в 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]