Сериализация 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 не изменит их дальше.