@sancelot posted a comment with a link to a github stylesheet which I tested alongside the answered instance (I upvoted). Additional detail here to show the following examples.
Example XML:
<avpList>
<eComStringAttributeValuePairList attributeName="orderTypeCode" qualifierCodeName="order" qualifierCodeList="OrderTypeCode" qualifierCodeListVersion="2">220</eComStringAttributeValuePairList>
<eComStringAttributeValuePairList attributeName="orderPriority">647</eComStringAttributeValuePairList>
<eComStringAttributeValuePairList attributeName="customerDocumentReference">0</eComStringAttributeValuePairList>
</avpList>
If I have a mixed attribute node value and use the upvoted answer I get the following output:
"avpList": {
"eComStringAttributeValuePairList": [
{
"attributeName": "orderTypeCode",
"qualifierCodeName": "order",
"qualifierCodeList": "OrderTypeCode",
"qualifierCodeListVersion": "2",
},
{
"attributeName": "orderPriority",
},
{
"attributeName": "customerDocumentReference",
}
]
}
Running it though JSONLint shows the issues with the trailing commas in addition to the missing element value.
Error: Parse error on line 30: ...Version": "2", }
Scripts parsed using XML Spy 2019.
Using the commented Github link and parsing produces the following JSON which validates on first pass through the linter. Please note that if you're expected any form of typed data in your JSON, neither stylesheets do it.
"avpList": {
"eComStringAttributeValuePairList": [
{
"attributeName": "orderTypeCode",
"qualifierCodeName": "order",
"qualifierCodeList": "OrderTypeCode",
"qualifierCodeListVersion": "2",
"text": "220"
},
{
"attributeName": "orderPriority",
"text": "647"
},
{
"attributeName": "customerDocumentReference",
"text": "0"
}
]
}
The below XSLT which I copied and pasted from here should help you to convert XML to JSON. Thanks :)
<?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>