Сериализация 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"},

1 ответ

Решение

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

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

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

Другие вопросы по тегам