我想在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时,它不会返回预期的结果。
尝试在replace
的所有select
表达式中使用XPath 2.0 xsl:value-of
函数:
"<xsl:value-of select='replace(*[local-name()="direccionCliente"], '"', '\\"')' />"
如果您声明,它可能更易于阅读,键入和维护
<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处理器。