在xsl中处理有效JSON的特殊字符。

问题描述 投票:0回答:1

我有一个包含特殊字符的xml,我正在使用xsl将这个xml转换为json。然而,它正在生成无效的json与解析错误。

这里是我的输入xml-

<?xml version="1.0" encoding="utf-8"?>
<root>
  <mydata>
    <data1>
      <Description>670054 [   CS\48] AGSB ON ROAD</Description>
    </data1>
  </mydata>
</root>

我正在尝试的XSL

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" indent="yes" />
    <xsl:template match="/">
        {
        "Data":[{
        "ShortDescription":<xsl:value-of select="root/mydata/data1/Description"/>
        }]}
</xsl:stylesheet>

预期产出-

 {
        "Data":[

            {
            "Id": "670054",
"ShortDescription": "670054 [   CS\48] AGSB ON ROAD"

        ]
        }

任何帮助将被感激!

json xml xslt
1个回答
1
投票

XSLT 3.0包含了输出JSON的功能。在早期的版本中,你可以使用文本输出方法 "手工 "完成,这就是你在这里所做的。但是,正确的格式化输出JSON完全是你的责任,特别是包括特殊字符的转义,如引号、换行和反斜杠。这在XSLT 2.0中使用replace()函数就很容易了,而在XSLT 1.0中就比较复杂了,不过exslt.org有一些模板,你可以将其整合到你的样式表中,比如str:replace。

当你在这个网站上询问有关XSLT的问题时,请说明你能够使用哪个XSLT版本。这往往会对答案产生影响。问题是XSLT 1.0现在已经很老了,但(像COBOL一样)很多人似乎还在使用它。


0
投票

在这里我找到了一个解决有效json这个问题的办法。

<xsl:template name="handleBackSlash">
 <xsl:param name="string" select="."/>
  <xsl:choose>
    <xsl:when test="contains($string, '\')">
      <xsl:value-of select="concat(substring-before($string, '\'), '\\' )"/>
      <xsl:call-template name="handleBackSlash">
        <xsl:with-param name="string" select="substring-after($string, '\')"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select="$string"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

然后调用template

 <xsl:call-template name="handleBackSlash">
        <xsl:with-param name="string" select="Description"/>
    </xsl:call-template>
© www.soinside.com 2019 - 2024. All rights reserved.