2017-12-01 16 views
0

XSLTが初めてのため、XSLT 3.0を使用してXMLに変換する単純なJSONがあります。私はwsec勧告に従ってparsejsonとjsontoxml関数を試しましたが、生成された出力は希望の形式ではありません。私は目的のためにサクソニカプロセッサを使用しています。キーの名前に関係なく、特定の構造の任意のjsonで使用できる単一のxsltを書くことは可能ですか? [JSON to XML transformation in XSLT 3.0、しかしXSLT 3.0の関数を使用してJSONをXMLに変換する

入力JSONに私のため

<data>{ 

     "Assets": [ 
    { "Asset": {   
     "Open": "25.15", 
     "High": "25.15", 
     "Low": "25.11", 
     "Close": "25.87" 
     }}, 
     { "Asset": {   
     "Open": "25.15", 
     "High": "25.15", 
     "Low": "25.11", 
     "Close": "25.87" 
     }}] 

} 
</data> 
が動作していない:それ以外の場合はどのように私は答えの例を試してみました

XSLT機能を使用して、所望のXMLにJSONに変換するために近づくことができます

予想される出力

<data> 
    <Assets> 
     <Asset> 
     <Close>25.87</Close> 
     <High>25.15</High> 
     <Low>25.11</Low> 
     <Open>25.15</Open> 
     </Asset> 
     <Asset> 
     <Close>25.87</Close> 
     <High>25.15</High> 
     <Low>25.11</Low> 
     <Open>25.15</Open> 
     </Asset> 
    </Assets> 
</data> 

私は以下

<?xml version="1.0" encoding="UTF-8"?> 
<map xmlns="http://www.w3.org/2005/xpath-functions"> 
    <array key="Assets"> 
     <map> 
     <map key="Asset"> 
      <string key="Open">25.15</string> 
      <string key="High">25.15</string> 
      <string key="Low">25.11</string> 
      <string key="Close">25.87</string> 
     </map> 
     </map> 
     <map> 
     <map key="Asset"> 
      <string key="Open">25.15</string> 
      <string key="High">25.15</string> 
      <string key="Low">25.11</string> 
      <string key="Close">25.87</string> 
     </map> 
     </map> 
    </array> 
</map> 

私のXSLT機能

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:math="http://www.w3.org/2005/xpath-functions/math" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs math" version="3.0"> 
    <xsl:output indent="yes" /> 
    <xsl:template match="data"> 
     <xsl:copy-of select="json-to-xml(.)" /> 
    </xsl:template> 
</xsl:stylesheet> 

私のXSLTを使用してしまった実際の出力は、私は、変換に

 var xslt = new FileInfo("myxslt.xslt"); 
     var input = new FileInfo("inputxml.xml"); 

     // Compile stylesheet 
     var processor = new Processor(true); 
     var compiler = processor.NewXsltCompiler(); 
     var executable = compiler.Compile(new Uri(xslt.FullName)); 
     Serializer serializer = processor.NewSerializer(); 
     serializer.SetOutputFile(txtOutput.Text); 

     // Do transformation to a destination 
     var destination = new XdmDestination(); 
     using (var inputStream = input.OpenRead()) 
     { 
      var transformer = executable.Load(); 
      transformer.SetInputStream(inputStream, new Uri(input.DirectoryName)); 
      transformer.Run(serializer); 
     } 
+0

問題は、希望する形式のJSONが許可されていない要素名「key 1」になるため、 '{" key 1 ":1}'です。そのため、 'json-to-xml'関数が返す形式は、JSONプロパティ名を属性に置きます。だから、現在あなたが望むものになるXMLからの変換を書くことはあなたの提示された入力には些細なものですが、あなたが一般的に望む結果がはっきりしません。 –

+0

@MartinHonnen:答えに感謝し、キーのスペースについてメモしてください。私はjsonをxsltプロセッサに渡す前にそれを処理しなければならないと思う。私は正しい? – user1817701

答えて

1

を行うためにサクソンで使用していたサンプルコードですあなたの与えられた入力に対してそれを解決するのは簡単です

<xsl:template match="data"> 
    <xsl:copy> 
     <xsl:apply-templates select="json-to-xml(.)/*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[@key]" xpath-default-namespace="http://www.w3.org/2005/xpath-functions"> 
    <xsl:element name="{@key}"> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

しかし、XML要素名に使用できないスペースやコロンや他の文字とJSONのプロパティ名を使用すると、簡単にそのアプローチを破ります。

+0

ありがとうございました。それはまさに私が望んでいたものです。 JSONをxmlに変換し、さらにxslt関数を適用してデータを操作してフラットXMLを作成したいと考えました。 – user1817701

+0

ネストされた配列を処理するなどの追加のルールが必要な場合があります。重要なことは、XMLでそのような構造を表す普遍的な方法がないことです。したがって、独自の選択が必要です。 –

関連する問題