Xslt generic将xml文件转换为json

时间:2017-06-16 13:41:36

标签: json xml xslt xslt-2.0

我想为我的java应用程序创建一个通用的xslt,它将xml文件转换为json输出。尽量使软件尽可能动态

我的xml输入:

       <?xml version="1.0"?>
        <notice>
        <driver>
           <forward>
                <system>
                    <type>xxx</type>
                    <parameters>
                        <parameter key="test1">test1</parameter>
                        <parameter key="test2">test2</parameter>
                        <parameter key="test3">test3</parameter>
                        <parameter key="test4">test4</parameter>
                        <parameter key="test5">test5</parameter>
                        <parameter key="test6">test6</parameter>
                    </parameters>
                  <priority nil="true"></priority>
                </system>
            </forward>
        </driver>

        </notice>

这是xslt(从互联网下载)

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" encoding="utf-8"/>

    <xsl:template match="/*[node()]">
        <xsl:text>{</xsl:text>
        <xsl:apply-templates select="." mode="detect" />
        <xsl:text>}</xsl:text>
    </xsl:template>

    <xsl:template match="*" mode="detect">
        <xsl:choose>
            <xsl:when test="name(preceding-sibling::*[1]) = name(current()) and name(following-sibling::*[1]) != name(current())">
                    <xsl:apply-templates select="." mode="obj-content" />
                <xsl:text>]</xsl:text>
                <xsl:if test="count(following-sibling::*[name() != name(current())]) &gt; 0">, </xsl:if>
            </xsl:when>
            <xsl:when test="name(preceding-sibling::*[1]) = name(current())">
                    <xsl:apply-templates select="." mode="obj-content" />
                    <xsl:if test="name(following-sibling::*) = name(current())">, </xsl:if>
            </xsl:when>
            <xsl:when test="following-sibling::*[1][name() = name(current())]">
                <xsl:text>"</xsl:text><xsl:value-of select="name()"/><xsl:text>" : [</xsl:text>
                    <xsl:apply-templates select="." mode="obj-content" /><xsl:text>, </xsl:text>
            </xsl:when>
            <xsl:when test="count(./child::*) > 0 or count(@*) > 0">
                <xsl:text>"</xsl:text><xsl:value-of select="name()"/>" : <xsl:apply-templates select="." mode="obj-content" />
                <xsl:if test="count(following-sibling::*) &gt; 0">, </xsl:if>
            </xsl:when>
            <xsl:when test="count(./child::*) = 0">
                <xsl:text>"</xsl:text><xsl:value-of select="name()"/>" : "<xsl:apply-templates select="."/><xsl:text>"</xsl:text>
                <xsl:if test="count(following-sibling::*) &gt; 0">, </xsl:if>
            </xsl:when>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="*" mode="obj-content">
        <xsl:text>{</xsl:text>
            <xsl:apply-templates select="@*" mode="attr" />
            <xsl:if test="count(@*) &gt; 0 and (count(child::*) &gt; 0 or text())">, </xsl:if>
            <xsl:apply-templates select="./*" mode="detect" />
            <xsl:if test="count(child::*) = 0 and text() and not(@*)">
                <xsl:text>"</xsl:text><xsl:value-of select="name()"/>" : "<xsl:value-of select="text()"/><xsl:text>"</xsl:text>
            </xsl:if>
            <xsl:if test="count(child::*) = 0 and text() and @*">
                <xsl:text>"text" : "</xsl:text><xsl:value-of select="text()"/><xsl:text>"</xsl:text>
            </xsl:if>
        <xsl:text>}</xsl:text>
        <xsl:if test="position() &lt; last()">, </xsl:if>
    </xsl:template>

    <xsl:template match="@*" mode="attr">
        <xsl:text>"</xsl:text><xsl:value-of select="name()"/>" : "<xsl:value-of select="."/><xsl:text>"</xsl:text>
        <xsl:if test="position() &lt; last()">,</xsl:if>
    </xsl:template>

    <xsl:template match="node/@TEXT | text()" name="removeBreaks">
        <xsl:param name="pText" select="normalize-space(.)"/>
        <xsl:choose>
            <xsl:when test="not(contains($pText, '&#xA;'))"><xsl:copy-of select="$pText"/></xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="concat(substring-before($pText, '&#xD;&#xA;'), ' ')"/>
                <xsl:call-template name="removeBreaks">
                    <xsl:with-param name="pText" select="substring-after($pText, '&#xD;&#xA;')"/>
                </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>

输出json

      {
           "notice":{
              "driver":{
                 "forward":{
                    "system":{
                       "type":"xxx",
                       "parameters":{
                          "parameter":[
                             {
                                "key":"test1",
                                "text":"test1"
                             },
                             {
                                "key":"test2",
                                "text":"test2"
                             },
                             {
                                "key":"test3",
                                "text":"test3"
                             },
                             {
                                "key":"test4",
                                "text":"test4"
                             },
                             {
                                "key":"test5",
                                "text":"test5"
                             },
                             {
                                "key":"test6",
                                "text":"test6"
                             }
                          ]
                       },
                       "priority":{
                          "nil":"true"
                       }
                    }
                 }
              }
           }
        }

相反,我想生成以下输出

     {
           "notice":{
              "driver":{
                 "forward":{
                    "system":{
                       "type":"xxx",
                       "parameters":{
                          "parameter":[
                             {
                                "text1":"test1"
                             },
                             {
                                "test2":"test2"

                             },
                             {
                                "test3":"test3"

                             },
                             {
                                "test4":"test4"

                             },
                             {
                                "test5":"test5"

                             },
                             {
                                "test6":"test6"

                             }
                          ]
                       },
                       "priority":{
                          "nil":"true"
                       }
                    }
                 }
              }
           }
        }

0 个答案:

没有答案