1

json の配列、オブジェクト、文字列を生成するには、xsl を使用して変換を行う必要があります。配列の生成に失敗しています。実際、私の要件は、XML を JXML に、JXML を json に変換する必要があることです。 jxmlからjsonへのxslt..XMLをJXMLに変換するための一般化されたソリューションが必要です..参照用に、サンプルxmlを作成しています..IP

<planexml>        
    <def/>
    <xyz>
        <Number>123</Number>
        <name>sen</name>
        <c>
            <type/>
        </c>
        <c>
            <type/>
        </c>
        <e>
            <wsx/>
        </e>
        <e>
            <wsx/>
        </e>
    </xyz>
        <xyz>
        <Number>123</Number>
        <name>sen</name>
        <c>
            <type/>
        </c>
        <c>
            <type/>
        </c>
        <e>
            <wsx/>
        </e>
        <e>
            <wsx/>
        </e>
    </xyz>
<planexml>

結果は

<json:object xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx">
    <json:object name="planexml">
        <json:string name="def"/>
        <json:array name="xyz">
            <json:object>
                <json:string name="number"/>
                <json:string name="name"/>
                <json:array name="c">
                    <json:object>
                        <json:string name="type"/>
                    </json:object>
                    <json:object>
                        <json:string name="type"/>
                    </json:object>
                </json:array>
                <json:array name="e">
                    <json:object>
                        <json:string name="wsx"/>
                    </json:object>
                    <json:object>
                        <json:string name="wsx"/>
                    </json:object>
                </json:array>
            </json:object>
            <json:object>
                <json:string name="number"/>
                <json:string name="name"/>
                <json:array name="c">
                    <json:object>
                        <json:string name="type"/>
                    </json:object>
                    <json:object>
                        <json:string name="type"/>
                    </json:object>
                </json:array>
                <json:array name="e">
                    <json:object>
                        <json:string name="wsx"/>
                    </json:object>
                    <json:object>
                        <json:string name="wsx"/>
                    </json:object>
                </json:array>
            </json:object>
        </json:array>
    </json:object>
</json:object>

できるだけ早く解決策が必要.. :(

4

2 に答える 2

1

出力例では、文字列の値が存在する場合は除外されます。おそらく、JSON に変換するときにこれらの値を保持したいので、これは間違っていると思います。それらが必要ない場合は、以下の文字列テンプレートを変更できます。

XML から JXML XSL

<xsl:template match="/" mode="#default">
    <json:object>
        <xsl:apply-templates/>
    </json:object>
</xsl:template>

<xsl:template match="*" mode="#default">
    <xsl:param name="display-name" select="true()" />
    <json:object>
        <xsl:if test="$display-name">
            <xsl:attribute name="name" select="name()" />
        </xsl:if>
        <xsl:apply-templates select="*[not(*)]" mode="string"/>            
        <xsl:for-each select="*[*]">
            <xsl:variable name="name" select="name()"/>
            <xsl:if test="not(preceding-sibling::*[name() eq $name])">
                <xsl:apply-templates select="." mode="array"/>
            </xsl:if>
        </xsl:for-each>
    </json:object>
</xsl:template>

<xsl:template match="*[not(*)]" mode="string">
    <json:string name="{name()}">
        <xsl:value-of select="."/>
    </json:string>
</xsl:template>

<xsl:template match="*" mode="array">
    <xsl:variable name="array-name" select="name()"/>
    <json:array name="{$array-name}">
        <xsl:for-each select=".|following-sibling::*[name() eq $array-name]">
            <xsl:apply-templates mode="#default" select=".">
                <xsl:with-param name="display-name" select="false()"/>
            </xsl:apply-templates>
        </xsl:for-each>
    </json:array>
</xsl:template>    

出力

<?xml version="1.0" encoding="UTF-8"?>
<json:object xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx">
    <json:object name="planexml">
        <json:string name="def"/>
        <json:array name="xyz">
            <json:object>
                <json:string name="Number">123</json:string>
                <json:string name="name">sen</json:string>
                <json:array name="c">
                    <json:object>
                        <json:string name="type"/>
                    </json:object>
                    <json:object>
                        <json:string name="type"/>
                    </json:object>
                </json:array>
                <json:array name="e">
                    <json:object>
                        <json:string name="wsx"/>
                    </json:object>
                    <json:object>
                        <json:string name="wsx"/>
                    </json:object>
                </json:array>
            </json:object>
            <json:object>
                <json:string name="Number">123</json:string>
                <json:string name="name">sen</json:string>
                <json:array name="c">
                    <json:object>
                        <json:string name="type"/>
                    </json:object>
                    <json:object>
                        <json:string name="type"/>
                    </json:object>
                </json:array>
                <json:array name="e">
                    <json:object>
                        <json:string name="wsx"/>
                    </json:object>
                    <json:object>
                        <json:string name="wsx"/>
                    </json:object>
                </json:array>
            </json:object>
        </json:array>
    </json:object>
</json:object>
于 2012-11-15T15:52:36.787 に答える
0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <xsl:element name="json:object">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
    <xsl:template match="*[*]">
        <xsl:param name="nodeName" select="name()"/>
        <xsl:variable name="firstNodeName" select="name(*[1])"/>
        <xsl:choose>
            <xsl:when test="count(../*[name(current()) = name()]) &gt;1">
                <xsl:variable name="el" select="name()"/>
                <xsl:if test="not(following-sibling::*[name()=$el])">
                    <json:array name="{name()}">
                        <xsl:for-each select="../*[name()=$el]">
                            <xsl:if test="position()!=1">
                                <json:object>
                                    <xsl:choose>
                                        <xsl:when test="not(child::node())">
                                            <xsl:text>null</xsl:text>
                                        </xsl:when>
                                        <xsl:otherwise>
                                            <xsl:apply-templates>
                                                <xsl:with-param name="nodeName" select="''"/>
                                            </xsl:apply-templates>
                                        </xsl:otherwise>
                                    </xsl:choose>
                                </json:object>
                            </xsl:if>
                            <xsl:if test="position()=1">
                                <json:object>
                                    <xsl:choose>
                                        <xsl:when test="not(child::node())">
                                            <xsl:text>null</xsl:text>
                                        </xsl:when>
                                        <xsl:otherwise>
                                            <xsl:apply-templates>
                                                <xsl:with-param name="nodeName" select="''"/>
                                            </xsl:apply-templates>
                                        </xsl:otherwise>
                                    </xsl:choose>
                                </json:object>
                            </xsl:if>
                        </xsl:for-each>
                    </json:array>
                </xsl:if>
            </xsl:when>
            <xsl:otherwise>
                <json:object name="{name()}">
                    <xsl:apply-templates/>
                </json:object>
            </xsl:otherwise>
        </xsl:choose>
        <!--</xsl:element>-->
    </xsl:template>
    <xsl:template match="*[not(*)]">
        <xsl:element name="json:string">
            <xsl:attribute name="name"><xsl:value-of select="name()"/></xsl:attribute>
            <xsl:value-of select="text()"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

これにより、期待される出力も提供されます

于 2012-11-16T08:37:27.130 に答える