Сериализация JSON с XPath 3.1 fn: serialize

Я использую XSLT 3.0 в Saxon-HE 9.8 и хочу работать с документами JSON в виде связанных данных в JSON-LD. В JSON-LD полные HTTP-URI часто отображаются как значения.

Когда я использую XPath 3.1 fn:serialize для передачи данных обратно в JSON, символы солидуса в http:// экранируются. Можно ли избежать этого экранирования при сериализации обратно в JSON?

Функция fn:parse-json имеет параметр escape, который может быть установлен в true() или false(), но я не вижу ничего похожего для fn:serialize.

Я могу удалить escape-символы с помощью fn:replace, но хотел бы знать, есть ли встроенный способ сделать это, которого мне не хватает.

Пример таблицы стилей:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:array="http://www.w3.org/2005/xpath-functions/array"
    xmlns:map="http://www.w3.org/2005/xpath-functions/map"
    xmlns:output="http://www.w3.org/2010/xslt-xquery-serialization"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">

    <xsl:output omit-xml-declaration="yes"/>

    <xsl:variable name="j" expand-text="no"> { "@context": "http://schema.org" } </xsl:variable>

    <xsl:template name="init">
        <xsl:sequence
            select="            
                $j => parse-json(map {'escape': false(), 'liberal': true()})
                => serialize(map {'method': 'json'})
                => replace('\\/', '/')
            "/>
    </xsl:template>

</xsl:stylesheet>

Без fn:replace результат будет {"@context":"http:\/\/schema.org"}. С fn:replace результат {"@context":"http://schema.org"}.


person tat    schedule 17.06.2017    source источник
comment
Как бы то ни было, я пробовал let $j := ' { "@context": "http://schema.org" } ' return $j => parse-json(map {'escape': false(), 'liberal': true()}) => serialize(map {'method': 'json'}) с BaseX и с Altova, и они тоже избегают / как \/, так что давайте "@context": "http:\/\/schema.org".   -  person Martin Honnen    schedule 18.06.2017
comment
w3.org/TR/xslt-xquery -serialization-31 / # to-a-json-string предполагает, что кодировка требуется спецификацией для метода вывода json.   -  person Martin Honnen    schedule 18.06.2017


Ответы (1)


При использовании Saxon 9.8, если функция serialize вызывается как => serialize(map {'method': 'json', 'use-character-maps' : map { '/' : '/' }}), солидус выводится как есть и не экранируется как \/.

См. Спецификацию https://www.w3.org/TR/xpath-functions-31/#func-serialize, объясняя, что второй аргумент serialize является map, где use-character-maps сам является map(xs:string, xs:string)?, а ключи "- это символы, которые должны отображаться (как экземпляры xs: string), и соответствующие им значения - это строки, которые будут заменены на эти символы "и 3.1 спецификация сериализации, в которой говорится:« Любой символ в строке, для которой определено отображение символов ... заменяется строкой замены, определенной в карте символов ». и «Любой другой символ во входной строке (но не символ, полученный в результате сопоставления символов) является кандидатом для [...] экранирования JSON.».

Так что в основном, если вы перечисляете символы на этой карте как сопоставленные сами себе, кодировка JSON не изменит их дальше.

person Martin Honnen    schedule 18.06.2017