XML в JSON с использованием XSLT - удалить корневой элемент и динамический тип данных

Мне нужна помощь, чтобы преобразовать XML в JSON с помощью XSLT, а также удалить корневой элемент и задать правильный тип данных для элементов JSON.

Я могу успешно преобразовать XML в JSON, а также удалить корневой элемент, однако он не отражает правильный тип данных, по умолчанию вывод представляет собой текст/строку. может ли кто-нибудь помочь мне решить эту проблему, пожалуйста. и еще один важный момент основан на параметрах, которые структура (динамическая) также может изменить, добавить новые столбцы или удалить столбцы.

Пример: Источник:

          {
   "denodo:view":{
      "name":"students",
      "students":{
         "studentNumber":"JT60J8",
         "studentName":"Adam",
         "courses":2,
         "price":4700.810,
         "discount":956.20,
         "createDate":1291248000,
         "lastUpdateDate":1291248000
      }
   }
}

Цель:

"students":{ "studentNumber": "JT60J8", "studentName": "Адам", "курсы": 2, "цена": 4700,810, "скидка": 956,20, "createDate": 1291248000, "lastUpdateDate": 1291248000 }

Используется XSLT:

        <xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="text" />
    <xsl:variable name="nl">
        <xsl:text>&#xa;</xsl:text>
    </xsl:variable>
    <xsl:variable name="tb">
        <xsl:text>&#x9;</xsl:text>
    </xsl:variable>
    <xsl:template match="/*">
        <!-- Open the root array -->
        <!--<xsl:text>[{</xsl:text>-->
    <xsl:text>{</xsl:text>
        <xsl:value-of select="$nl" />
        <!-- Process all the child nodes of the root -->
        <xsl:apply-templates select="*" mode="subitem" >
            <xsl:with-param name="indent" select="$tb" />
        </xsl:apply-templates>
        <!-- Close the root array -->
        <xsl:value-of select="$nl" />
        <!--<xsl:text>}]</xsl:text>-->
  <xsl:text>}</xsl:text>
    </xsl:template>
    <xsl:template match="*" mode="subitem" >
        <!-- child element at any level. The indent parameter allows for better layout of the output JSON -->
        <xsl:param name="indent"/>
        <!-- newindent is used as the indent for children of this node -->
        <xsl:variable name="newindent">
            <xsl:value-of select="$indent" />
            <xsl:value-of select="$tb"/>
        </xsl:variable>
        <!-- output the name of this node in quotes, ready for the content to follow -->
        <xsl:value-of select="$indent" />
        <xsl:text>"</xsl:text>
        <xsl:value-of select="name()" />
        <xsl:text>" :</xsl:text>
        <!-- check if this node has children, if not, simply output the text value, otherwise outoput an array -->
        <xsl:choose>
            <xsl:when test=" count( ./* ) = 0 ">
                <!-- This is a text value only -->
                <xsl:text> "</xsl:text>
                <!-- Make sure that any embedded quotes are escaped -->
                <xsl:call-template name="string-replace-all">
                    <xsl:with-param name="text" select="." />
                    <xsl:with-param name="replace">"</xsl:with-param>
                    <xsl:with-param name="by">\"</xsl:with-param>
                </xsl:call-template>
                <xsl:text>"</xsl:text>
                <!-- check if we need a comma and a new line, not required if this is the last output value -->
                <xsl:if test=" position() != last() ">
                    <xsl:text>,</xsl:text>
                    <xsl:value-of select="$nl" />
                </xsl:if>
            </xsl:when>
            <xsl:otherwise>
                <!-- This node has children, so we need to process them as an array -->
                <!-- Array opening -->
                <xsl:text>[</xsl:text>
                <xsl:value-of select="$nl" />
                <xsl:value-of select="$newindent" />
                <xsl:text>{</xsl:text>
                <xsl:value-of select="$nl" />
                <!-- Process all the elements in the array (recursive call to this template) -->
                <xsl:apply-templates select="*" mode="subitem" >
                    <xsl:with-param name="indent">
                        <xsl:value-of select="$newindent" />
                    </xsl:with-param>
                </xsl:apply-templates>
                <!-- Close the array -->
                <xsl:value-of select="$nl" />
                <xsl:value-of select="$newindent" />
                <xsl:text>}</xsl:text>
                <xsl:value-of select="$nl" />
                <xsl:value-of select="$indent" />
                <xsl:text>]</xsl:text>
                <!-- If this is not the last node then we need a comma and line feed -->
                <xsl:if test=" position() != last() ">
                    <xsl:text>,</xsl:text>
                    <xsl:value-of select="$nl" />
                </xsl:if>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
    <xsl:template name="string-replace-all">
        <!-- This code provided thanks to @codesling on stackoverflow -->
        <xsl:param name="text" />
        <xsl:param name="replace" />
        <xsl:param name="by" />
        <xsl:choose>
            <xsl:when test="contains($text, $replace)">
                <xsl:value-of select="substring-before($text,$replace)" />
                <xsl:value-of select="$by" />
                <xsl:call-template name="string-replace-all">
                    <xsl:with-param name="text"
                        select="substring-after($text,$replace)" />
                    <xsl:with-param name="replace" select="$replace" />
                    <xsl:with-param name="by" select="$by" />
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$text" />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

0 ответов

Другие вопросы по тегам