Я использую посредник XSLT для преобразования полезной нагрузки XML в полезную нагрузку JSON, но результирующий вывод JSON не такой, как ожидалось, поскольку весь JSON упакован как значение поля. Кроме того, мне просто нужно использовать этот посредник XSLT, а не какие-либо другие. Вот мой XSLT-код:
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:soapenv = "http://www.w3.org/2003/05/soap-envelope"
xmlns:ns = "http://service.com">
<xsl:output method = "text" omit-xml-declaration = "yes" indent = "no"/>
<xsl:strip-space elements = "*"/>
<xsl:template match = "/">
{
"response": {
"animals": {
"animal": [
<xsl:for-each select = "//ns:animal">
{
"name": "<xsl:value-of select = "ns:name"/>",
"color": "<xsl:value-of select = "ns:color"/>",
"info": {
"animalInfo": [
<xsl:for-each select = "ns:info/ns:animalInfo">
{
"someVal1": "<xsl:value-of select = "ns:someVal1"/>",
"someVal2": "<xsl:value-of select = "ns:someVal2"/>"
}<xsl:if test = "position() != last()">,</xsl:if>
</xsl:for-each>
]
}
}<xsl:if test = "position() != last()">,</xsl:if>
</xsl:for-each>
]
}
}
}
</xsl:template>
</xsl:stylesheet>
И вот результирующий вывод JSON в виде строки внутри «текстового» поля. Весь JSON обернут как значение поля text
:
ПРИМЕЧАНИЕ. Когда он завернут, есть escape-символы \
. Я удалил их, чтобы сделать JSON понятным.
{
"text": "{
"response":{
"animals":{
"animal":[
{
"name": "name",
"color": "color",
"info":{
"animalInfo":[
{
"someVal1":"someVal1",
"someVal2":"someVal2"
},
{
"someVal1":"someVal3",
"someVal2":"someVal4"
}
]
}
},
{
"name": "name",
"color": "color",
"info":{
"animalInfo":[
]
}
}
]
}
}
}"
}
Ответ JSON, который мне нужен после удаления поля text
и разворачивания его значения,
{
"response":{
"animals":{
"animal":[
{
"name": "name",
"color": "color",
"info":{
"animalInfo":[
{
"someVal1":"someVal1",
"someVal2":"someVal2"
},
{
"someVal1":"someVal3",
"someVal2":"someVal4"
}
]
}
},
{
"name": "name",
"color": "color",
"info":{
"animalInfo":[
]
}
}
]
}
}
}
}
Неотредактированная полезная нагрузка JSON.
{
"text": "{\"response\":{\"animals\":{\"animal\":[{\"name\":\"name\",\"color\":\"color\",\"info\":{\"animalInfo\":[{\"someVal1\":\"someVal1\",\"someVal2\":\"someVal2\"},{\"someVal1\":\"someVal3\",\"someVal2\":\"someVal4\"}]}},{\"name\":\"name\",\"color\":\"color\",\"info\":{\"animalInfo\":[]}}]}}}"
}
Я так старался развернуть JSON из этого текстового поля, но я не могу его разрешить и даже не уверен, почему это происходит. Может ли кто-нибудь помочь мне решить эту проблему с помощью XSLT? Заранее спасибо.
На самом деле вы не сказали нам, каков ваш требуемый результат или чем фактический результат отличается. Ваш код, кажется, производит именно тот результат, который можно было бы ожидать.
Ваш XSLT создает объект JSON, содержащий один ключ (response
), но в вашем выводе этот ответ встроен в другой объект JSON, который, я должен предположить, генерируется средой, в которой работает ваш XSLT (т.е. wso2-micro-integrator
). Сам XSLT выглядит нормально, хотя NB вам нужно будет экранировать символы " и \, если вам нужно скопировать их из входного XML.
@ycr @MichaelKay @Conal Tuohy Я обновил свой вопрос. Я сделал ошибку при добавлении выходного JSON, так как отформатировал его, чтобы было понятно. На самом деле проблема в том, что весь JSON, который мне нужен, находится внутри этого поля text
в качестве его значения. Мне нужно удалить это поле text
и развернуть это значение JSON как полный JSON. Надеюсь, вы понимаете, что я имею в виду.
@SomeGuy Я до сих пор не понимаю твоей проблемы. Получаете ли вы встроенный JSON в JSON в виде строки? Вы хотите преобразовать это в правильный JSON?
Проблема не в вашем XSLT. Ваш XSLT в порядке (хотя, обратите внимание, он, вероятно, должен обрабатывать символы \ и "). Настоящая проблема заключается в среде, в которой работает ваш XSLT. Эта среда запускает XSLT, записывает его выходные данные и вставляет их в документ JSON. К сожалению. Я ничего не знаю о wso2
, поэтому я не могу вам помочь.
@ycr Да, точно. Фактический JSON, который мне нужен, находится внутри тела JSON, но как значение поля text
. Например: { "text": "Actual JSON is here. Wrapped as a value"}
. Мне нужно развернуть его, а также удалить это text
.
@ConalTuohy О, хорошо, я понял. Это нормально. Спасибо за комментарии. Я ценю это.
Здесь вы можете использовать либо Payloadfactory Mediator
, либо Script Mediator
. Взгляните на следующий код.
Посредник фабрики полезной нагрузки
<payloadFactory media-type = "json">
<format>$1</format>
<args>
<arg expression = "json-eval($.text)" evaluator = "json"/>
</args>
</payloadFactory>
Посредник скриптов
<property expression = "json-eval($.text)" name = "jsonText" scope = "default" type = "STRING"/>
<script language = "nashornJs"><![CDATA[
var pl = JSON.parse(mc.getProperty('jsonText'));
mc.setPayloadJSON(pl);
]]></script>
XSLT предназначен для работы с XML, а не наоборот. Почему вы не можете использовать какие-либо другие посредники здесь? Кроме того, добавьте входной формат XML и ожидаемый выходной формат JSON.