XSL中的JSON解析转义符\“ \”

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

我想在XSL文件中正确解析这些单词\“ SOME TEXT \”。

这是我的要求

{
  "MessageRequest": {
    "Header": {
      "HeaderRequest": {
        "consumer": "TCRM",
        "country": "COUNTRY",
        "dispositivo": "MOVIL",
        "language": "ES",
        "modulo": "OM",
        "msgType": "REQUEST",
        "operation": "registrar",
        "pid": "20200403101514585",
        "system": "OM",
        "timestamp": "2020-04-03T16:15:14.5852858+01:00",
        "userId": "65566898",
        "wsIp": "1.1.1.1"
      }
    },
    "Body": {
      "nombreUsuario": "E702759",
      "listaEdificios": [
        {
          "idItem": 12236,
          "direccionCliente": "CA. LOS ZORZALES 160",
          "nodo": "5119B03-A",
          "edificio": "E09",
          "nombreEdificio": "ZORZALES",
          "coordenadaX": 5059.5,
          "coordenadaY": 5059.5,
          "sessionId": "2020040310040839079440"
        },
        {
          "idItem": 15077,
          "direccionCliente": "CA. D ESQ. CA.DOS S/N - COND. PQ. DEL AGUSTINO \"LOS ALAMOS\" TORRE A1",
          "nodo": "LMAG008",
          "edificio": "E01",
          "nombreEdificio": "LOS ALAMOS",
          "coordenadaX": 5060.5,
          "coordenadaY": 5060.5,
          "sessionId": "2020040310040839079440"
        }
      ]
    }
  }
}

这是我的XSL文件

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
 <xsl:strip-space elements="*"/>
  <xsl:variable name="path" select="*/MessageRequest/Body"/>
 <xsl:output method="text"/>
 <xsl:template match="/">{
              "nombreUsuario": "<xsl:value-of select='$path/nombreUsuario'/>",
              "listaEdificios": [
              <xsl:for-each select="$path/*[local-name()='listaEdificios']">
              {
                "idItem" : "<xsl:value-of select='*[local-name()="idItem"]' />",
                "direccionCliente" : "<xsl:value-of select='*[local-name()="direccionCliente"]' />",
                "nodo" : "<xsl:value-of select='*[local-name()="nodo"]' />",
                "edificio" : "<xsl:value-of select='*[local-name()="edificio"]' />",
                "nombreEdificio" : "<xsl:value-of select='*[local-name()="nombreEdificio"]' />",
                "coordenadaX" : "<xsl:value-of select='*[local-name()="coordenadaX"]' />",
                "coordenadaY" : "<xsl:value-of select='*[local-name()="coordenadaY"]' />",
                "sessionId" : "<xsl:value-of select='*[local-name()="sessionId"]' />"
              }
              <xsl:if test="not(position() = last())">,</xsl:if>
              </xsl:for-each>
              ]
}
</xsl:template>
</xsl:stylesheet>

消息转换后,服务器返回400错误的请求消息,并出现以下错误。

"Body":    {
      "timestamp": "2020-04-03T17:43:50.290+0000",
      "status": 400,
      "error": "Bad Request",
      "message": "JSON parse error: Unexpected character ('L' (code 76)): was expecting comma to separate Object entries\n at [Source: (weblogic.servlet.internal.ServletInputStreamImpl); line: 40, column: 76]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Unexpected character ('L' (code 76)): was expecting comma to separate Object entries\n at [Source: (weblogic.servlet.internal.ServletInputStreamImpl); line: 40, column: 76]\n at [Source: (weblogic.servlet.internal.ServletInputStreamImpl); line: 40, column: 26] (through reference chain: [\"listaEdificios\"]->java.util.ArrayList[3])",
      "path": "/api/edificio/v1.0.0/registrar"
   } 

但是当手动测试请求时,没有错误。它仅表示服务器接受\"LOS ALAMOS\",但是在应用xsl时,它不会返回预期的结果。

json spring-boot xslt
1个回答
0
投票

尝试在replace的所有select表达式中使用XPath 2.0 xsl:value-of函数:

"<xsl:value-of select='replace(*[local-name()="direccionCliente"], &apos;"&apos;, &apos;\\"&apos;)' />"

如果您声明,它可能更易于阅读,键入和维护

<xsl:param name="quote" as="xs:string">"</xsl:param>
<xsl:param name="quote-replacement" as="xs:string">\\"</xsl:param>

作为全局参数并使用,例如

"<xsl:value-of select='replace(*[local-name()="direccionCliente"], $quote, $quote-replacement)' />"

正如我所说的,这是XPath 2.0,因此它需要像Saxon 9这样的XSLT 2处理器。

© www.soinside.com 2019 - 2024. All rights reserved.