在通过XSLT将JSONx属性转换为XML时面临问题

时间:2016-05-17 03:39:42

标签: xml xslt jsonx

我编写了一个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>

请帮忙

1 个答案:

答案 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>