JSON Разобрать escape-символ \ "\" в XSL - PullRequest
1 голос
/ 03 апреля 2020

Я хочу правильно проанализировать эти слова \ "НЕКОТОРЫЙ ТЕКСТ \" в XSL-файле.

Вот мой запрос

{
  "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 он не возвращает ожидаемый результат.

1 Ответ

0 голосов
/ 04 апреля 2020

Попробуйте использовать функцию XPath 2.0 replace во всех ваших select выражениях xsl:value-of s:

"<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, поэтому для него требуется процессор XSLT 2, такой как Saxon 9.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...