我必须使用xsl进行转换才能生成数组,对象,json字符串。我无法生成数组。.实际上我的要求是我必须将XML转换为JXML,将JXML转换为json。我有 jxml 到 json 的通用 xslt。现在我需要将XML转换为JXML的通用解决方案。作为参考,我正在制作样本 xml..知识产权
<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>
需要尽快的解决方案.. :(
示例输出排除字符串的值(如果存在)。我假设这是不正确的,因为您可能希望在转换为 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>
<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()]) >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>
这也提供了预期的输出