XML в JSON XSLT - PullRequest
       9

XML в JSON XSLT

0 голосов
/ 23 октября 2018

У меня проблема с моим кодом 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>&quot;</xsl:text><xsl:value-of select="."/><xsl:text>&quot;</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"
    }
    ],
            }}

Спасибо, Викрам

...