У меня есть следующий xml
<Request>
<Record>
<ID>123456789</ID>
<OtherID>ABC123</OtherID>
<Title>Example</Title>
<Properties>
<Attribute type="Main">
<Name>Description</Name>
<Value>This is an example</Value>
</Attribute>
<Attribute type="Main">
<Name>Source</Name>
<Value>A1</Value>
</Attribute>
<Attribute type="Main">
<Name>Source</Name>
<Value>B</Value>
</Attribute>
<Attribute type="Main">
<Name>Represenative</Name>
<Value>Mike</Value>
</Attribute>
<Attribute type="Main">
<Name>Animal</Name>
<Value>Elephant</Value>
</Attribute>
</Properties>
</Record>
</Request>
Я хочу иметь следующий json.
{
"Record":{
"ID":"123456789",
"OtherID":"ABC123",
"Title":"Example",
"Properties":[
{
"Type":"Main",
"Value":"Source",
"Name":"A1"
},
{
"Type":"Main",
"Value":"Source",
"Name":"B"
},
{
"Type":"Main",
"Value":"Representative",
"Name":"Mike"
},
{
"Type":"Main",
"Value":"Animal",
"Name":"Elephant"
}
],
"Description":"This is an example"
}
}
Обратите внимание, что свойство description не является частью массива, оно находится втот же уровень, что и у свойств, ID, OtherID и Title.
Я применяю следующий xslt для преобразования xml в json.В этом xml я объявляю переменную, которая будет содержать описание и будет добавлена в конец объекта
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0">
<xsl:output method="text" />
<xsl:template match="/">
<xsl:variable name="description2" select="''" />
{
<xsl:for-each select="Request/Record">
"Record": {
"ID":"<xsl:value-of select="ID" />",
"OtherId": "<xsl:value-of select="OtherID" />",
"Title":"Example",
<xsl:if test="Properties">
"Properties": [
<xsl:for-each select="Properties/Attribute">
<xsl:if test="soi:Name = 'Description'">
<xsl:variable name="description2" select="<xsl:value-of select="Value" />" />
<xsl:if test="position() != last()">,</xsl:if>
</xsl:if>
<xsl:if test="Name != 'Description'">
{
"Type": "Main",
"Name": "<xsl:value-of select="Name" />",
"Value": "<xsl:value-of select="Value" />"
}
<xsl:if test="position() != last()">,</xsl:if>
</xsl:if>
</xsl:for-each>
]
</xsl:if>
}<xsl:if test="position() != last()">,</xsl:if>
</xsl:for-each>
<xsl:if test="description2!=''">
,"Description":"<xsl:value-of select="$description2"/>"
</xsl:if>
}
</xsl:template>
К сожалению, я получаю этот вывод
{
"Request":{
"ID":"123456789",
"OtherID":"ABC123",
"Title":"Example",
"Properties":[
{
"Type":"Main",
"Value":"Source",
"Name":"A1"
},
{
"Type":"Main",
"Value":"Source",
"Name":"B"
},
{
"Type":"Main",
"Value":"Representative",
"Name":"Mike"
},
{
"Type":"Main",
"Value":"Animal",
"Name":"Elephant"
}
],
"Description":""
}
}
Значение description пусто, потому что я не знаю, как переназначить значение описания переменной в цикле.Я использовал двойной цикл, чтобы получить только описание, но оно очень неэффективно.
Любой совет приветствуется
Заранее спасибо.