Concat добавляет двойные кавычки

concat добавляет еще одну двойную кавычку, если входная строка включает ее. Я использую XQuery 3.1 в eXide. A̶f̶a̶i̶k̶, ̶ ̶e̶x̶i̶d̶e̶ ̶u̶s̶e̶s̶ ̶s̶a̶x̶o̶s̶ ̶s̶a̶x̶o̶n̶ ̶a̶s̶ ̶x̶o̶n̶ ̶a̶s̶ ̶x̶q̶u̶e̶r̶y̶ ̶e̶n̶g̶i̶n̶̶ ̶e̶n̶g̶i̶n̶e̶.

return concat("'", 'bar') оценивается как 'bar, что и ожидается.

return concat('"', 'bar') оценивается как ""bar.

Как идет? Я думал, что нет разницы между одинарными и двойными кавычки в xquery.

Вот мой сценарий:

xquery version "3.1";
let $c := concat('"','car')
return $c

person Justin P.    schedule 23.08.2018    source источник
comment
Какой движок XQuery 3.1 вы используете, как вы выполняете запрос и как вы отображаете результаты? XQuery (язык) ведет себя не так, как вы описываете. Это может быть ошибка в вашем процессоре, или может быть объяснение наблюдаемого эффекта, связанное с тем, как вы работаете.   -  person Michael Kay    schedule 23.08.2018
comment
Спасибо за ваш комментарий. Я добавил некоторые детали настройки к моему вопросу.   -  person Justin P.    schedule 25.08.2018


Ответы (2)


По умолчанию eXide сериализует результаты запроса, используя стандартный метод адаптивного вывода. . Поскольку функция concat() возвращает строку, адаптивный вывод заключает строки в двойные кавычки и избегает любых двойных кавычек в строке, удваивая их. Это объясняет наблюдаемое вами явление.

Из спецификации W3C, указанной выше:

Экземпляр xs:string, xs:untypedAtomic или xs:anyURI сериализуется путем заключения значения в двойные кавычки и удвоения любых кавычек внутри значения.

Если вместо этого вы хотите увидеть свои результаты без экранирования кавычек, вы можете использовать раскрывающееся меню над панелью вывода запросов eXide и вместо этого выбрать «Текстовый метод» или «Метод XML».

документация от eXide (доступна через "Справка" > "Документация") объясняет его сериализацию функции и настройки по умолчанию следующим образом:

В версии 2.4.0 eXide отказалась от своей давней библиотеки «красивой печати», теперь используя встроенные методы сериализации eXist. Это изменение означает повышенную точность пробелов и скорость при просмотре результатов запроса и превращает eXide в песочницу сериализации. Переключая методы вывода в раскрывающемся меню «Вывод», вы можете сериализовать результаты запроса не только как адаптивный, JSON, XML или старый «прямой» (рендеринг) метод, но также как текст, HTML5, XHTML, XHTML5 и МикроXML. Новый флажок «Отступ» позволяет переключать отступ результатов запроса или нет.

Наконец, я должен отметить, что у eXist есть собственный механизм XQuery, и eXide передает запросы для выполнения непосредственно в eXist, а не в Saxon. eXist использует Saxon исключительно для XSLT, т. е. когда вы используете модуль transform для вызова XSLT из XQuery.

person Joe Wicentowski    schedule 25.08.2018

Это не всегда верно. Нет никакой разницы в том, как ваш XQuery будет оцениваться с использованием любого символа кавычки в качестве границы строки. Однако символы в строковом выражении в кавычках оцениваются буквально. В вашем примере вам пришлось использовать другой символ кавычки внутри строки, потому что иначе он не будет анализировать (""" или '''). Но вы по-прежнему можете использовать любой литеральный символ кавычки, который вы хотите, избегая кавычки, соответствующей той, которая использовалась для ограничения вашего строкового выражения. Вы можете сделать это, используя два из них последовательно:

concat('''', 'bar'), concat("""", 'bar')
=>
'bar
"bar

Для улучшения удобочитаемости вы также можете использовать соответствующие объекты, &quote для " и ' для '. Эти правила объясняются в спецификации здесь: https://www.w3.org/TR/xquery-30/#doc-xquery30-EscapeQuot

person wst    schedule 23.08.2018
comment
Я до сих пор не понимаю, как это добавляет еще одну кавычку в пример. Как вы сказали: разделитель строк вообще не имеет значения, важно то, что внутри него. Поэтому я ожидаю, что кавычка будет оцениваться буквально как... ну... кавычка. - person Justin P.; 23.08.2018
comment
@ДжастинП. Это разные символы: один — кавычка, другой — апостроф. В контексте оценки границ строки XQuery они эквивалентны, но внутри строки символы оцениваются буквально, и они разные. Ваш второй пример неверен. concat('"', 'bar') =› "bar - person wst; 23.08.2018