1

我必须使用 xsl 进行转换以生成数组、对象、json 字符串。我无法生成数组。实际上我的要求是我必须将 XML 转换为 JXML 并将 JXML 转换为 json 。我有通用的xslt for jxml to json..现在我需要将 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 回答