我编写了一个xslt来将JSOnx转换为XML。如何不转换属性:查看像tokenized这样的属性。
这是我的xslt:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0" xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx" exclude-result-prefixes="json">
<xsl:template match="/json:object">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="json:array[@name]">
<xsl:element name="{@name}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="json:object">
<xsl:element name="{../@name}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="json:object[@name]">
<xsl:element name="{@name}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="json:string[@name]">
<xsl:element name="{@name}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="json:string[@attribute]">
<xsl:attribute name="{@name}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<xsl:template match="json:number[@name]">
<xsl:element name="{@name}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="json:boolean[@name]">
<xsl:element name="{@name}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="json:null[@name]">
<xsl:element name="{@name}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
这是输入JSONx:
<json:object xsi:schemaLocation="http://www.datapower.com/schemas/json jsonx.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx"
>
<json:object name="creditCard">
<json:string name="firstName">Nitin</json:string>
<json:string name="lastName">Jain</json:string>
<json:string name="pUser">myUser</json:string>
<json:string name="actionType">SALE</json:string>
<json:string name="address1">3111 Camino Del Rio N</json:string>
<json:string name="address2">None</json:string>
<json:string name="city">San Diego</json:string>
<json:string name="state">California</json:string>
<json:string name="postalCode">92115</json:string>
<json:string name="country">USA</json:string>
<json:object name="cardNum">
<json:boolean name="@Tokenize">true</json:boolean>
<json:string name="#text">1111222233334444</json:string>
</json:object>
<json:string name="chgAmt">1200</json:string>
<json:string name="legalEntityApp">myEntityApp</json:string>
<json:string name="accountID">myAccount</json:string>
<json:string name="expiryDate">1020</json:string>
<json:boolean name="testMode">false</json:boolean>
<json:string name="tranId">tranId10000</json:string>
<json:string name="merchantId">merchantID1000</json:string>
<json:string name="processor">payScout</json:string>
<json:object name="token">
<json:boolean name="@tokenized">false</json:boolean>
<json:string name="#text">tokenABCD</json:string>
</json:object>
<json:object name="application">
<json:string name="@version">1.01</json:string>
<json:string name="#text">Cognet</json:string>
</json:object>
<json:string name="cvv2Code">123</json:string>
<json:string name="origin">PHONE ORDER</json:string>
</json:object>
</json:object>
这是我的输出:
<creditCard>
<firstName>Nitin</firstName>
<lastName>Jain</lastName>
<pUser>myUser</pUser>
<actionType>SALE</actionType>
<address1>3111 Camino Del Rio N</address1>
<address2>None</address2>
<city>San Diego</city>
<state>California</state>
<postalCode>92115</postalCode>
<country>USA</country>
<cardNum>true 1111222233334444</cardNum>
<chgAmt>1200</chgAmt>
<legalEntityApp>myEntityApp</legalEntityApp>
<accountID>myAccount</accountID>
<expiryDate>1020</expiryDate>
<testMode>false</testMode>
<tranId>tranId10000</tranId>
<merchantId>merchantID1000</merchantId>
<processor>payScout</processor>
<token>false tokenABCD</token>
<application>1.01 Cognet</application>
<cvv2Code>123</cvv2Code>
<origin>PHONE ORDER</origin>
</creditCard>
这是预期的输出xml:
<creditCard>
<accountID>myAccount</accountID>
<actionType>SALE</actionType>
<address1>3111 Camino Del Rio N</address1>
<address2>None</address2>
<application version="1.01">Cognet</application>
<cardNum Tokenize="true">1111222233334444</cardNum>
<chgAmt>1200</chgAmt>
<city>San Diego</city>
<country>USA</country>
<cvv2Code>123</cvv2Code>
<expiryDate>1020</expiryDate>
<firstName>Nitin</firstName>
<lastName>Jain</lastName>
<legalEntityApp>myEntityApp</legalEntityApp>
<merchantId>merchantID1000</merchantId>
<origin>PHONE ORDER</origin>
<pUser>myUser</pUser>
<postalCode>92115</postalCode>
<processor>payScout</processor>
<state>California</state>
<testMode>false</testMode>
<token tokenized="false">tokenABCD</token>
<tranId>tranId10000</tranId>
</creditCard>
请帮忙
答案 0 :(得分:0)
怎么办?你没有一个可以做到这一点的模板。 快速又脏,你可以替换
<xsl:template match="json:object[@name]">
<xsl:element name="{@name}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
与
<xsl:template match="json:object[@name and json:string[@name='#text']]">
<!-- object that is just a container for attr + value -->
<xsl:element name="{@name}">
<xsl:for-each select="*[starts-with(@name,'@')]">
<xsl:attribute name="{substring(@name,2)}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:for-each>
<xsl:value-of select="json:string[@name='#text']"/>
</xsl:element>
</xsl:template>
<xsl:template match="json:object[@name and not(json:string[@name='#text'])]">
<!-- normal object -->
<xsl:element name="{@name}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>