使用XPath 3.1 fn:serialize进行JSON序列化

7
我正在使用Saxon-HE 9.8中的XSLT 3.0,并希望将JSON文档作为链接数据与JSON-LD一起使用。在JSON-LD中,完整的HTTP URIs经常出现作为值。
当我使用XPath 3.1的fn:serialize将数据回转到JSON时,http://中的斜杠字符被转义了。在序列化回JSON时,是否有可能避免这种转义? fn:parse-json函数具有一个可以设置为true()false()escape参数,但我没有看到类似于fn:serialize的内容。
我可以使用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"}

就此而言,我尝试了使用BaseX和Altova执行以下代码:let $j := ' { "@context": "http://schema.org" } ' return $j => parse-json(map {'escape': false(), 'liberal': true()}) => serialize(map {'method': 'json'})。它们也将/转义为\/,因此输出结果为"@context": "http:\/\/schema.org" - Martin Honnen
https://www.w3.org/TR/xslt-xquery-serialization-31/#to-a-json-string 表明,输出方法为json时,编码是由规范强制规定的。 - Martin Honnen
1个回答

7
使用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编码不会进一步更改它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接