输入XML
<Root> <Result> <System> <Name>ABC</Name> <ID pname="PAD"> <value>4567</value> </ID> <lastTime>2013-11-06T17:36:46.000-05:00</lastTime> </System> <line>Metals</line> </Result> <Result> <System> <Name>CAYS</Name> <ID pname="PAD"> <value>MCIERT</value> </ID> <ID pname="ATPAD"> <value>56412</value> </ID> <lastTime>2013-12-06T16:43:36.000-05:00</lastTime> </System> <System> <Name>CAYS</Name> <ID pname="CAD"> <value>DGSG</value> </ID> <ID pname="ARCAD"> <value>2847114</value> </ID> <lastTime>2013-12-07T20:02:38.000-05:00</lastTime> </System> <line>Minerals</line> </Result> </Root>
输出Json
{ "Root": { "Result": [ { "System": { "Name": "ABC", "ID": { "pname": "PAD", "value": "4567" }, "lastTime": "2013-11-06T17:36:46.000-05:00" }, "line": "Metals" }, { "System": [ { "Name": "CAYS", "ID": [ { "pname": "PAD", "value": "MCIERT" }, { "pname": "ATPAD", "value": "56412" } ], "lastTime": "2013-12-06T16:43:36.000-05:00" }, { "Name": "CAYS", "ID": [ { "pname": "CAD", "value": "DGSG" }, { "pname": "ARCAD", "value": "2847114" } ], "lastTime": "2013-12-07T20:02:38.000-05:00" } ], "line": "Minerals" } ] } }
如何编写通用的xslt样式表,它将输入的xml转换为json
输入可能在根目录下有太多结果,在结果下可能有系统和名称,在系统下还有ID名称和值。
我从此处复制并粘贴的以下XSLT 应该可以帮助您将XML转换为JSON。谢谢 :)
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:template match="/">{ <xsl:apply-templates select="*"/>} </xsl:template> <!-- Object or Element Property--> <xsl:template match="*"> "<xsl:value-of select="name()"/>" :<xsl:call-template name="Properties"> <xsl:with-param name="parent" select="'Yes'"> </xsl:with-param> </xsl:call-template> </xsl:template> <!-- Array Element --> <xsl:template match="*" mode="ArrayElement"> <xsl:call-template name="Properties"/> </xsl:template> <!-- Object Properties --> <xsl:template name="Properties"> <xsl:param name="parent"></xsl:param> <xsl:variable name="childName" select="name(*[1])"/> <xsl:choose> <xsl:when test="not(*|@*)"><xsl:choose><xsl:when test="$parent='Yes'"> <xsl:text>"</xsl:text><xsl:value-of select="."/><xsl:text>"</xsl:text></xsl:when> <xsl:otherwise>"<xsl:value-of select="name()"/>":"<xsl:value-of select="."/>"</xsl:otherwise> </xsl:choose> </xsl:when> <xsl:when test="count(*[name()=$childName]) > 1">{ "<xsl:value-of select="$childName"/>" :[<xsl:apply-templates select="*" mode="ArrayElement"/>] }</xsl:when> <xsl:otherwise>{ <xsl:apply-templates select="@*"/> <xsl:apply-templates select="*"/> }</xsl:otherwise> </xsl:choose> <xsl:if test="following-sibling::*">,</xsl:if> </xsl:template> <!-- Attribute Property --> <xsl:template match="@*">"<xsl:value-of select="name()"/>" : "<xsl:value-of select="."/>", </xsl:template> </xsl:stylesheet>