我在 Saxon-HE 9.8 中使用 XSLT 3.0,并且希望将 JSON 文档用作链接数据JSON-LD https://json-ld.org/。在 JSON-LD 中,完整的 HTTP URI 通常显示为值。
当我使用 XPath 3.1 时fn:serialize
要将数据往返返回 JSON,中的斜线字符http://
被逃脱。序列化回 JSON 时是否可以避免这种转义?
The 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>
Without fn:replace
,结果是{"@context":"http:\/\/schema.org"}
. With fn:replace
,结果是{"@context":"http://schema.org"}
.
使用 Saxon 9.8,如果serialize
函数被称为=> serialize(map {'method': 'json', 'use-character-maps' : map { '/' : '/' }})
,斜线按原样输出,而不是转义为\/
.
查看规格https://www.w3.org/TR/xpath-functions-31/#func-serialize https://www.w3.org/TR/xpath-functions-31/#func-serialize解释第二个论点serialize
成为一个map
哪里的use-character-maps
本身就是一个map(xs:string, xs:string)?
并且“键是要映射的字符(作为 xs:string 实例),其对应的值是要替换这些字符的字符串”和3.1 序列化规范 https://www.w3.org/TR/xslt-xquery-serialization-31/#to-a-json-string说“定义了字符映射的字符串中的任何字符......都被字符映射中定义的替换字符串替换。”和“输入字符串中的任何其他字符(但不是由字符映射生成的字符)都是 [...] JSON 转义的候选字符。”。
因此,基本上,如果您将该映射中的字符列出为映射到自身,则 JSON 编码将不会进一步更改它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)