Получение следующего сиблинга в 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 ответ:
Порядок расположения узлов в 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]