【发布时间】:2019-10-16 04:47:35
【问题描述】:
如何避免 JSON 中 XML 的单线和双引号转义?
鉴于此
- solidus 字符(又名正斜杠,
/)可以,但不必,是 在 JSON 中转义,并且 - XML 属性可以使用
'而不是"以避免在JSON 字符串值中转义,
在 XSLT 中实现这些潜在的序列化改进的最佳方式是什么?
这个XML,
<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
<array key="o_array">
<map>
<string key="s/1">x/y/z</string>
</map>
<map>
<string key="s2"><![CDATA[<a href="/x/y">Link</a> a/b "test"]]></string>
</map>
</array>
</map>
对此XSLT的输入,
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:value-of select="xml-to-json(.,map{'indent':true()})"/>
</xsl:template>
</xsl:stylesheet>
产生(通过 Saxon,XSLT Fiddle demo)这个 JSON 输出:
{ "o_array" :
[
{ "s\/1" : "x\/y\/z" },
{ "s2" : "<a href=\"\/x\/y\">Link<\/a> a\/b \"test\"" } ] }
出于美观的目的(JSON 是不必要的丑陋)和最小化文件大小(在禁用缩进之后),我想生成以下 JSON:
{ "o_array" :
[
{ "s/1" : "x/y/z" },
{ "s2" : "<a href='/x/y'>Link</a> a/b \"test\"" } ] }
注意事项:
-
单引号: Saxon 特定的序列化选项
saxon:single-quotes似乎很有帮助,但我不清楚如何将此选项与xml-to-json()一起使用。 -
Solidus: XSLT 序列化选项
map{'method': 'json', 'use-character-maps': map{ '/': '/' }}为 described by Martin Honnen 似乎很有帮助,但同样,如何将此选项与xml-to-json()一起使用让我感到困惑(哈哈)。 -
string/@escape和string/@escape-key属性,根据我对spec 的阅读并通过实验确认,在这里无济于事。
【问题讨论】:
标签: json xml xslt saxon xslt-3.0