如何在XSLT中避免XML转JSON时的斜杠与双引号转义?
解决XSLT中xml-to-json()的序列化优化问题
要实现你期望的JSON输出(斜杠不转义、XML属性用单引号),可以借助Saxon的扩展序列化选项,结合xml-to-json()的参数配置来完成,具体方案如下:
1. 关键扩展选项说明
Saxon提供了两个关键的扩展参数来解决你的问题:
saxon:single-quotes: 设置为true()时,序列化XML属性值时会使用单引号代替双引号,避免JSON字符串中出现额外的转义双引号。saxon:escape-slash: 设置为false()时,会禁止对JSON字符串中的斜杠(/)进行转义,保留原始的斜杠格式。
2. 完整XSLT实现
需要先声明Saxon的命名空间,然后将这两个选项加入到xml-to-json()的参数map中:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:saxon="http://saxon.sf.net/" version="3.0"> <xsl:output method="text"/> <xsl:template match="/"> <xsl:value-of select="xml-to-json(., map{ 'indent': true(), 'saxon:single-quotes': true(), 'saxon:escape-slash': false() })"/> </xsl:template> </xsl:stylesheet>
3. 输出结果验证
用上述XSLT处理你的输入XML后,会生成你期望的JSON:
{ "o_array" : [ { "s/1" : "x/y/z" }, { "s2" : "<a href='/x/y'>Link</a> a/b \"test\"" } ] }
补充说明
- 关于
string/@escape和string/@escape-key:这两个属性是用来控制是否对JSON键或值中的特殊字符(如双引号、换行)进行转义,但无法控制斜杠的转义行为,也无法改变XML属性的引号类型,因此不适用你的场景。 - 确保使用的是支持这些扩展选项的Saxon版本(建议Saxon 9.8及以上),因为这些是Saxon特有的功能,并非XSLT 3.0标准的一部分。
内容的提问来源于stack exchange,提问作者kjhughes
相关产品推荐
相关产品推荐

