2016-05-17 2 views
0

Я написал xslt для преобразования JSOnx в XML. как бы он не преобразовывал атрибуты: посмотрите на атрибуты вроде tokenized.проблема с обращением при преобразовании атрибутов JSONx в XML через XSLT

Вот мой 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

Как это сделать? У вас нет шаблона, который бы это сделал. Быстрая и грязная, вы могли бы заменить

<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> 
+0

Спасибо Стефан .. это работает – user3132758

Смежные вопросы