2016-12-29 2 views
0

以下の形式でXMLをJSONからXML変換に生成しました。要素のリスト型のxsltでxmlを再構成する方法

フルオリジナルのXML例:

例1:

<?xml version="1.0" encoding="UTF-8"?> 
<linked-hash-map> 
    <entry> 
     <string>dataset</string> 
     <linked-hash-map> 
     <entry> 
      <string>id</string> 
      <string>120140</string> 
     </entry> 
     <entry> 
      <string>dataset_code</string> 
      <string>GDP</string> 
     </entry> 
     <entry> 
      <string>column_names</string> 
      <list> 
       <string>DATE</string> 
       <string>VALUE</string> 
      </list> 
     </entry> 
     <entry> 
      <string>frequency</string> 
      <string>quarterly</string> 
     </entry> 
     <entry> 
      <string>type</string> 
      <string>Time Series</string> 
     </entry> 
     <entry> 
      <string>premium</string> 
      <boolean>false</boolean> 
     </entry> 
     <entry> 
      <string>data</string> 
      <list> 
       <list> 
        <string>2016-07-01</string> 
        <double>18675.3</double> 
       </list> 
       <list> 
        <string>2016-04-01</string> 
        <double>18450.1</double> 
       </list> 
       <list> 
        <string>2016-01-01</string> 
        <double>18281.6</double> 
       </list> 
      </list> 
     </entry> 
     <entry> 
      <string>database_id</string> 
      <int>118</int> 
     </entry> 
     </linked-hash-map> 
    </entry> 
</linked-hash-map> 

例2:

<?xml version="1.0" encoding="UTF-8"?> 
<linked-hash-map> 
    <entry> 
     <string>dataset</string> 
     <linked-hash-map> 
     <entry> 
      <string>dataset_code</string> 
      <string>AAPL</string> 
     </entry> 
     <entry> 
      <string>column_names</string> 
      <list> 
       <string>DATE</string> 
       <string>Open</string> 
       <string>High</string> 
       <string>Low</string> 
       <string>Close</string> 
      </list> 
     </entry> 
     <entry> 
      <string>frequency</string> 
      <string>quarterly</string> 
     </entry> 
     <entry> 
      <string>type</string> 
      <string>Time Series</string> 
     </entry> 
     <entry> 
      <string>data</string> 
      <list> 
       <list> 
        <string>2016-07-01</string> 
        <double>116.45</double> 
        <double>117.1095</double> 
        <double>116.4</double> 
        <double>116.73</double> 
       </list> 
       <list> 
        <string>2016-04-01</string> 
        <double>18450.1</double> 
        <double>113.1095</double> 
        <double>112.4</double> 
        <double>100.73</double> 
       </list> 
       <list> 
        <string>2016-01-01</string> 
        <double>18281.6</double> 
        <double>157.1095</double> 
        <double>136.4</double> 
        <double>156.73</double> 
       </list> 
      </list> 
     </entry> 
     <entry> 
      <string>database_id</string> 
      <int>218</int> 
     </entry> 
     </linked-hash-map> 
    </entry> 
</linked-hash-map> 

以下の部分は、両方のXMLSに変換する必要があります。

<entry> 
     <string>column_names</string> 
     <list> 
      <string>DATE</string> 
      <string>VALUE</string> 
     </list> 
</entry> 
    <entry> 
      <string>data</string> 
      <list> 
       <list> 
       <string>2016-07-01</string> 
       <double>18675.3</double> 
       </list> 
       <list> 
       <string>2016-04-01</string> 
       <double>18450.1</double> 
       </list> 
      </list> 
    </entry> 

これは次の形式に変換する方法ですか?

1.

<entry> 
     <Date>2016-07-01</Date> 
      <Value>18675.3</Value> 
     </entry> 
     <entry> 
      <Date>2016-04-01</Date> 
      <Value>18450.1</Value> 
     </entry> 

2.

<entry> 
    <Date>2016-07-01</Date> 
    <Value>18675.3</Value> 
    <Date>2016-04-01</Date> 
    <Value>18450.1</Value> 
    </entry> 

注:すべてのデータ(日付、バリュー、データエントリー、など)ここでは動的です。

XSLTの一般的な実装を探して、目的の出力を取得します。 xsltでは不可能な場合は、Javaでこれを変換することになります。

すべてのヘルプは大

+1

Hmmm、あなたはこれについて詳しく説明できます:_すべてのデータ(日付、値、データ、入力など)はここで動的です。あなたは変換のルールを記述することができますか?たとえば、「常に最初のXML要素をスキップします...」 – Stefan

+0

** 1。**あなたが私たちに示す入力は整形式XMLではありません(ルート要素は1つではありません)。 - ** 2。**。 **すべての**要素名が「動的」であるとは信じられません。いずれにしても、ここにはいくつかのルールが必要です。 –

+0

こんにちはステファン、これを見ていただきありがとうございます。混乱の謝罪列名( "Date"、 "Value")は動的です。その列に何列目が登場するのか、それがどのようなテキストであるのかわからないからです。また、次の配列の "data"名も静的ではありません。これはデータセットまたは何か他のものとして来る可能性があります。私が理解していることは、ヘッダー(列名リスト)とデータが2つのリストに入っており、これらのリストを両方とも単一の配列またはフラット要素にマージする必要があるということです。 XMLから個々のリストを削除します。 xsdを生成するときに、これらの列名が分かります。 – user3187932

答えて

0

次のスタイルシートは、両方のあなたの例のために動作しますappreciated.``だろう。私はそれがそれよりも一般的である必要はないと思っています - もしそうなら、私はどのように見えません。 your previous questionと同様に

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/linked-hash-map"> 
    <xsl:variable name="col-names" select="entry/linked-hash-map/entry[string='column_names']/list/string" /> 
    <root> 
     <xsl:for-each select="entry/linked-hash-map/entry[string='data']/list/list"> 
      <xsl:variable name="current-row" select="." /> 
      <entry> 
       <xsl:for-each select="$col-names"> 
        <xsl:variable name="i" select="position()" /> 
        <xsl:element name="{.}"> 
         <xsl:value-of select="$current-row/*[$i]" /> 
        </xsl:element> 
       </xsl:for-each> 
      </entry> 
     </xsl:for-each> 
    </root> 
</xsl:template> 

</xsl:stylesheet> 

、これが供給されるカラム名は、有効なXML要素名であることを前提としています。

+0

マイケルに感謝します。正しい。あなたは以前の私にも助けてくれました。それは私のために働いた。これらのクラブを一緒に援助し、最終的なスタイルシートを提供してください。 orignal example xmlはここでトピックに掲載されています。 – user3187932

+0

2つの入力は非常に異なるため、2つの回答は互換性がありません。ここには列名のリストと各行の値のリストがあります。そこには、兄弟ノードのペアとして名前と値がありました。 –

+0

こんにちはMichael、要素の作成中に、column_namesの値がこのような場合は、スペースまたは特殊文字を_で置き換える方法を教えてください。 「調整」、「分割比」? – user3187932

関連する問題