Sitecore предоставляет способ экранирования слов в запросе Sitecore, которые содержат символы, которые им не нравятся.К таким символам относятся дефисы и пробелы.Чтобы упростить свою жизнь, я написал простую вспомогательную функцию, которая будет экранировать каждую часть запроса Sitecore, и какое-то время она работала нормально:
public static string EscapePath(string path){
return Regex.Replace(path, @"([^/]+)", "#$1#").Replace("#*#", "*");
}
(Replace("#*#","*")
там, потому чтоSitecore не нравится, когда вы оборачиваете звездочку в хэши).
Как я уже говорил, какое-то время это работало нормально.Сегодня я столкнулся с ситуацией, когда это не удается:
EscapePath("/sitecore/content/Seattle/OR/00010046");
Экранированная последовательность выглядит достаточно невинной:
/#sitecore#/#content#/#Seattle#/#OR#/#00010046#
, но запрос внутри Sitecore не выполнен с сообщением Identifier, GUID or "*" expected at position 44
.Я сузил проблему до #OR#
в запросе и внезапно понял, что происходит.По всей видимости, Sitecore использует одиночное слово OR
даже после экранирования, что означает, что вы объединяете два или более запросов вместе (то есть зарезервированное слово OR
).Очевидное решение - заменить все экземпляры #OR#
на *[@@name='OR']
, и это прекрасно работает.Однако, для меня это выглядит как хак.
Я знаю, что это, скорее всего, произойдет только с узлами с именами OR
и AND
, но я не могу найти никакой документации по SDN , в котором говорится о любых зарезервированных словах внутри Sitecore Query, и нет никаких упоминаний о том, как правильно экранировать запрос, кроме того, чтобы обернуть запрос в хэши.Я бы гарантированно не столкнулся с этой проблемой?Или, что еще лучше, документ с изложением всех зарезервированных слов в Sitecore Query?Возможно, я мог бы придерживаться синтаксиса XPath и просто иметь дело с (задокументированными) крайними случаями с экранированием этих значений, но я бы хотел придерживаться Sitecore Query, если это возможно.