Concat добавляет двойные кавычки
concat
добавляет еще одну двойную кавычку, если входная строка содержит одну. Я использую XQuery 3.1 на eXide. A̶F̶A̶I̶K̶, ̶ ̶e̶X̶i̶d̶e̶ ̶u̶s̶e̶s̶ ̶S̶a̶x̶o̶n̶ ̶a̶s̶ ̶X̶Q̶u̶e̶r̶y̶ ̶e̶n̶g̶i̶n̶e̶.̶ (это не так, см. Ответ joewiz ниже).
Ошибка возникает, когда я оцениваю сцепленные строки.
return concat("'", 'bar')
оценивает 'bar
что ожидается.
return concat('"', 'bar')
оценивает ""bar
,
Как идет? Я думал, что в xquery нет разницы между одинарными и двойными кавычками.
Вот мой сценарий:
xquery version "3.1";
let $c := concat('"','car')
return $c
2 ответа
По умолчанию eXide сериализует результаты запроса, используя стандартный адаптивный метод вывода. Так как concat()
функция возвращает строку, адаптивный вывод заключает строки в двойные кавычки и экранирует любые двойные кавычки в строке, удваивая их. Это объясняет явление, которое вы видите.
Из спецификации W3C, связанной выше:
Экземпляр
xs:string
,xs:untypedAtomic
или жеxs:anyURI
сериализуется, заключая значение в двойные кавычки и удваивая любые кавычки внутри значения.
Если вместо этого вы хотели бы видеть свои результаты без экранирования таких цитат, вы можете использовать выпадающее меню чуть выше области вывода запросов eXide и выбрать вместо этого "Метод текста" или "Метод XML".
В документации eXide (доступной через "Справка"> "Документация") объясняется ее функция сериализации и настройки по умолчанию:
В 2.4.0 eXide отказался от своей давней библиотеки "pretty-printing", теперь используя встроенные методы сериализации eXist. Это изменение означает повышение точности и скорости пробелов при просмотре результатов запроса и превращает eXide в изолированную программную среду сериализации. Переключая методы вывода через раскрывающееся меню "Вывод", вы можете сериализовать результаты запроса не только как Adaptive, JSON, XML или старый "прямой" (визуализированный) метод, но также как Text, HTML5, XHTML, XHTML5 и MicroXML. Новый флажок "Отступ" позволяет вам переключаться, будут ли результаты запроса иметь отступ или нет.
Наконец, я должен отметить, что у eXist есть собственный встроенный движок XQuery, и eXide передает запросы непосредственно в eXist для выполнения, а не в Saxon. eXist использует Saxon исключительно для XSLT, т. е. когда вы используете transform
модуль для вызова XSLT из XQuery.
Это не правда универсально. Нет разницы в том, как ваш XQuery будет оцениваться с использованием любого символа кавычки в качестве границы строки. Однако символы в строковом выражении в кавычках оцениваются буквально. В вашем примере вам пришлось использовать другой символ кавычки внутри строки, потому что он не будет анализироваться ("""
или же '''
) иначе. Но вы все равно можете использовать любой буквальный символ кавычки, который хотите, экранируя кавычку, соответствующую той, которая использовалась для ограничения вашего строкового выражения. Вы можете сделать это, используя два из них последовательно:
concat('''', 'bar'), concat("""", 'bar')
=>
'bar
"bar
Для улучшения читаемости вы также можете использовать соответствующие объекты, "e
за "
а также '
за '
, Эти правила описаны в спецификации здесь: https://www.w3.org/TR/xquery-30/