6

我在 Saxon-HE 9.8 中使用 XSLT 3.0 并希望将 JSON 文档作为JSON-LD中的链接数据使用。在 JSON-LD 中,完整的 HTTP URI 通常显示为值。

当我使用 XPath 3.1fn:serialize将数据往返返回到 JSON 时,其中的固线字符http://被转义。序列化回 JSON 时是否可以避免这种转义?

fn:parse-json函数有一个escape可以设置为true()or的参数false(),但我没有看到任何类似的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"}

4

1 回答 1

6

使用 Saxon 9.8,如果serialize函数调用 as => serialize(map {'method': 'json', 'use-character-maps' : map { '/' : '/' }}),则solidus 按原样输出,而不是转义为\/

请参阅规范https://www.w3.org/TR/xpath-functions-31/#func-serialize将第二个参数解释serialize为 a本身就是 amap并且“键是要映射的字符(如 xs :string 实例),并且其对应的值是要替换这些字符的字符串”和3.1 序列化规范说“字符串中定义了字符映射的任何字符......被字符中定义的替换字符串替换地图。” 和“输入字符串中的任何其他字符(但不是由字符映射产生的字符)都是 [...] JSON 转义的候选对象。”。use-character-mapsmap(xs:string, xs:string)?

因此,基本上,如果您将该映射中的字符列出为映射到自身,则 JSON 编码不会进一步改变它们。

于 2017-06-18T12:59:35.373 回答