2017-02-15 5 views
0

私はxsltを学んでいます。私はあなたの助けが必要です。私はJsonxにSoapメッセージを変換する必要があります。問題はフィールド "body"にすべての子が型配列でなければならないということです。型オブジェクトでなければならない最後の子を除いて、次のエントリコードがあります。xslt配列の問題を持つjsonxへの変形ソープ

<NS1:Envelope xmlns:NS1="http://schemas.xmlsoap.org/soap/envelope/"> 
    <NS1:Body> 
     <NS2:Consulta xmlns:NS2="http://ejemplo.com/servicios"> 
     <header> 
      <fechaHora>201612021719232416</fechaHora> 
      <idioma>es_EC</idioma> 
      <ip>192.168.1.23</ip> 
     </header> 
     <body> 
      <productos> 
       <tarjetas> 
        <tarjeta> 
        <numerotarjeta>123456789</numerotarjeta> 
        <tipo>MASTERCARD GOLD STN</tipo> 
        <moneda>USD</moneda> 
        <valorPagar>300</valorPagar> 
        </tarjeta> 
        <tarjeta> 
        <numerotarjeta>123456987</numerotarjeta> 
        <tipo>MASTERCARD GOLD STN</tipo> 
        <moneda>USD</moneda> 
        <valorPagar>15</valorPagar> 
        </tarjeta> 
       </tarjetas> 
       <libros> 
        <libro> 
        <id>123456789</id> 
        <nombre>Libro 1</nombre> 
        </libro> 
       </libros> 
       <revistas> 
        <revista> 
        <id>12</id> 
        <nombre>revista 1</nombre> 
        </revista> 
        <revista> 
        <id>122</id> 
        <nombre>revista 2</nombre> 
        </revista> 
       </revistas> 
      </productos> 
     </body> 
     <error> 
      <error1>0</error1> 
      <mensaje>OK</mensaje> 
     </error> 
     </NS2:Consulta> 
    </NS1:Body> 
</NS1:Envelope> 

私はそれが要素を含む配列であるので、私は、この本タグに問題があるここで、私は次の結果を持っているXSLTを適用することにより、次のXSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx"> 
    <xsl:output method="xml" indent="yes" encoding="UTF-8" omit-xml-declaration="yes"/> 
    <xsl:strip-space elements="*"/> 
    <!-- Array --> 
    <xsl:template match="*[*[2]][name(*[1])=name(*[2])]"> 
     <json:object name="{name()}"> 
      <json:array name="{name(*[1])}"> 
       <xsl:apply-templates/> 
      </json:array> 
     </json:object> 
    </xsl:template> 
    <!-- Array member --> 
    <xsl:template match="*[parent::*[ name(*[1])=name(*[2]) ]] | /"> 
     <json:object> 
      <xsl:apply-templates/> 
     </json:object> 
    </xsl:template> 
    <!-- Object --> 
    <xsl:template match="*"> 
     <json:object name="{name()}"> 
      <xsl:apply-templates/> 
     </json:object> 
    </xsl:template> 

    <!-- Object Body --> 
    <xsl:template match="body[not(body)]"> 
     <json:array name="{name()}"> 
      <xsl:apply-templates/> 
     </json:array> 
    </xsl:template> 
    <!-- String --> 
    <xsl:template match="*[not(*)]"> 
     <json:string name="{name()}"> 
      <xsl:value-of select="."/> 
     </json:string> 
    </xsl:template> 
</xsl:stylesheet> 

を使用していますオブジェクトに変換しますが、配列として受け取る必要があります

<json:object xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx"> 
    <json:object name="NS1:Envelope"> 
     <json:object name="NS1:Body"> 
     <json:object name="NS2:Consulta"> 
      <json:object name="header"> 
       <json:string name="fechaHora">201612021719232416</json:string> 
       <json:string name="idioma">es_EC</json:string> 
       <json:string name="ip">192.168.1.23</json:string> 
      </json:object> 
      <json:array name="body"> 
       <json:object name="productos"> 
        <json:object name="tarjetas"> 
        <json:array name="tarjeta"> 
         <json:object> 
          <json:string name="numerotarjeta">123456789</json:string> 
          <json:string name="tipo">MASTERCARD GOLD STN</json:string> 
          <json:string name="moneda">USD</json:string> 
          <json:string name="valorPagar">300</json:string> 
         </json:object> 
         <json:object> 
          <json:string name="numerotarjeta">123456987</json:string> 
          <json:string name="tipo">MASTERCARD GOLD STN</json:string> 
          <json:string name="moneda">USD</json:string> 
          <json:string name="valorPagar">15</json:string> 
         </json:object> 
        </json:array> 
        </json:object> 
        <json:object name="libros"> 
        <json:object name="libro"> 
         <json:string name="id">123456789</json:string> 
         <json:string name="nombre">Libro 1</json:string> 
        </json:object> 
        </json:object> 
        <json:object name="revistas"> 
        <json:array name="revista"> 
         <json:object> 
          <json:string name="id">12</json:string> 
          <json:string name="nombre">revista 1</json:string> 
         </json:object> 
         <json:object> 
          <json:string name="id">122</json:string> 
          <json:string name="nombre">revista 2</json:string> 
         </json:object> 
        </json:array> 
        </json:object> 
       </json:object> 
      </json:array> 
      <json:object name="error"> 
       <json:string name="error1">0</json:string> 
       <json:string name="mensaje">OK</json:string> 
      </json:object> 
     </json:object> 
     </json:object> 
    </json:object> 
</json:object> 

しかし、どこでも本や雑誌が単一の要素になることができ、それをオブジェクトとして変換することができますが、要素の配列であるので、以下を受け取る必要があります。 XSLTを書くとき

<json:object name="libros"> 
    <json:array name="libro"> 
     <json:string name="id">123456789</json:string> 
     <json:string name="nombre">Libro 1</json:string> 
    </json:array> 
</json:object> 

答えて

0

あなたが(例えばlibroslibro)要素の名前を知っていますか?その場合、あなたは、単にテンプレートでそれらに名前を付けることができます:ここで

   <json:object name="libros"> 
       <json:array name="libro"> 
        <json:object> 
         <json:string name="id">123456789</json:string> 
         <json:string name="nombre">Libro 1</json:string> 
        </json:object> 
       </json:array> 
       </json:object> 

は、提案が入れ子のレベルに基づいて、一般的なアプローチを使用しようとしている

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx"> 
    <xsl:output method="xml" indent="yes" encoding="UTF-8" omit-xml-declaration="yes"/> 
    <xsl:strip-space elements="*"/> 
    <!-- Array --> 
    <xsl:template match="*[*[2]][name(*[1])=name(*[2])] | libros[libro]"> 
     <json:object name="{name()}"> 
      <json:array name="{name(*[1])}"> 
       <xsl:apply-templates/> 
      </json:array> 
     </json:object> 
    </xsl:template> 
    <!-- Array member --> 
    <xsl:template match="*[parent::*[ name(*[1])=name(*[2]) ]] |/| libro"> 
     <json:object> 
      <xsl:apply-templates/> 
     </json:object> 
    </xsl:template> 
    <!-- Object --> 
    <xsl:template match="*"> 
     <json:object name="{name()}"> 
      <xsl:apply-templates/> 
     </json:object> 
    </xsl:template> 

    <!-- Object Body --> 
    <xsl:template match="body[not(body)]"> 
     <json:array name="{name()}"> 
      <xsl:apply-templates/> 
     </json:array> 
    </xsl:template> 
    <!-- String --> 
    <xsl:template match="*[not(*)]"> 
     <json:string name="{name()}"> 
      <xsl:value-of select="."/> 
     </json:string> 
    </xsl:template> 
</xsl:stylesheet> 

http://xsltransform.net/ncntCSX出力(例えば身体の子孫は壮大を持ちます子要素になるアレイを、子供たちのアレイメンバー):http://xsltransform.net/ncntCSX/1

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx"> 
    <xsl:output method="xml" indent="yes" encoding="UTF-8" omit-xml-declaration="yes"/> 
    <xsl:strip-space elements="*"/> 
    <!-- Array --> 
    <xsl:template match="*[*[2]][name(*[1])=name(*[2])] | body//*[*/*]"> 
     <json:object name="{name()}"> 
      <json:array name="{name(*[1])}"> 
       <xsl:apply-templates/> 
      </json:array> 
     </json:object> 
    </xsl:template> 
    <!-- Array member --> 
    <xsl:template match="*[parent::*[ name(*[1])=name(*[2]) ]] |/| body//*[*[not(*)]]"> 
     <json:object> 
      <xsl:apply-templates/> 
     </json:object> 
    </xsl:template> 
    <!-- Object --> 
    <xsl:template match="*"> 
     <json:object name="{name()}"> 
      <xsl:apply-templates/> 
     </json:object> 
    </xsl:template> 

    <!-- Object Body --> 
    <xsl:template match="body[not(body)]"> 
     <json:array name="{name()}"> 
      <xsl:apply-templates/> 
     </json:array> 
    </xsl:template> 
    <!-- String --> 
    <xsl:template match="*[not(*)]"> 
     <json:string name="{name()}"> 
      <xsl:value-of select="."/> 
     </json:string> 
    </xsl:template> 
</xsl:stylesheet> 

Onlineは、出力を作成し、

    <json:object name="libros"> 
        <json:array name="libro"> 
         <json:object> 
          <json:string name="id">123456789</json:string> 
          <json:string name="nombre">Libro 1</json:string> 
         </json:object> 
        </json:array> 
       </json:object> 

librosの場合、XSLTコードの要素名は明記されていません。

+0

問題は、私は常にlibrosというタグを持っているとは限らず、periodicos、revistasなどの他のタイプのアイテムがあるかもしれないので、フィールド名に縛られずに動的にしたいと思っています。また、私は体内の要素にのみ適用する必要があります – Kalin666

+0

どのような要素を配列に変換したいのですか?あなたはそれを説明しておらず、代わりにあなたが望んでいないXSLTしか表示していません。例えば一致させることは容易である。 'body // *'はaまたは 'body'要素の中の要素にしかマッチしませんでしたが、これまでのところ、要素から配列への変換や要素からオブジェクトへの変換の基準は説明されていません。 –

+0

@ Kalin666、私はあなたが望むかもしれないと推測しようとして、2番目のサンプルを追加しました。 –

関連する問題