У меня проблема с моим кодом xslt, который был написан для преобразования xml в файл json.Проблема в том, что этот XSLT не распознает объекты массива, как для некоторых XML-файлов, этот сегмент может появляться только один раз.В приведенном ниже примере ITEM, LANGUAGES, DESCRIPTION & LONGTEST должны рассматриваться как массив, даже если он входит в файл только один раз.Мне нужна ваша поддержка, чтобы обновить приведенный ниже xslt, чтобы рассматривать эти поля как массив.
Исходный XML:
<?xml version="1.0" encoding="UTF-8"?>
<ITEM>
<ID>L-2989</ID>
<NAME>test_n</NAME>
<LANGUAGES>
<languageCode>EN</languageCode>
</LANGUAGES>
<DESCRIPTION>
<description>Short description short description</description>
<languageCode>EN</languageCode>
</DESCRIPTION>
<CURRENCY>XXX</CURRENCY>
<LONGTEXT>
<languageCode>EN</languageCode>
<longtext>Long text long text long text long text</longtext>
</LONGTEXT>
</ITEM>
XSLT-код:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">{
<xsl:apply-templates select="*"/>}
</xsl:template>
<!-- Object or Element Property-->
<xsl:template match="*">
"<xsl:value-of select="name()"/>" :<xsl:call-template name="Properties">
<xsl:with-param name="parent" select="'Yes'"> </xsl:with-param>
</xsl:call-template>
</xsl:template>
<!-- Array Element -->
<xsl:template match="*" mode="ArrayElement">
<xsl:call-template name="Properties"/>
</xsl:template>
<!-- Object Properties -->
<xsl:template name="Properties">
<xsl:param name="parent"></xsl:param>
<xsl:variable name="childName" select="name(*[1])"/>
<xsl:choose>
<xsl:when test="not(*|@*)"><xsl:choose><xsl:when test="$parent='Yes'"> <xsl:text>"</xsl:text><xsl:value-of select="."/><xsl:text>"</xsl:text></xsl:when>
<xsl:otherwise>"<xsl:value-of select="name()"/>":"<xsl:value-of select="."/>"</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:when test="count(*[name()=$childName]) > 1">{ "<xsl:value-of select="$childName"/>" :[<xsl:apply-templates select="*" mode="ArrayElement"/>] }</xsl:when>
<xsl:otherwise>{
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="*"/>
}</xsl:otherwise>
</xsl:choose>
<xsl:if test="following-sibling::*">,</xsl:if>
</xsl:template>
<!-- Attribute Property -->
<xsl:template match="@*">"<xsl:value-of select="name()"/>" : "<xsl:value-of select="."/>",
</xsl:template>
</xsl:stylesheet>
Текущий вывод JSON:
{
"ITEM" :{
"ID" :"L-2989",
"NAME" :"test_n",
"LANGUAGES" :{
"languageCode" :"EN"
},
"DESCRIPTION" :{
"description" :"Short description short description",
"languageCode" :"EN"
},
"CURRENCY" :"XXX",
"LONGTEXT" :{
"languageCode" :"EN",
"longtext" :"Long text long text long text long text"
}
}}
Ожидаемый вывод JSON:
[
{
"ITEM" :{
"ID" :"L-2989",
"NAME" :"test_n",
"LANGUAGES" :[
{
"languageCode" :"EN"
}
],
"DESCRIPTION" :[
{
"description" :"Short description short description",
"languageCode" :"EN"
}
],
"CURRENCY" :"XXX",
"LONGTEXT" :[
{
"languageCode" :"EN",
"longtext" :"Long text long text long text long text"
}
],
}}
Спасибо, Викрам