2017-10-18 20 views
1

XML1をXML2に変換するにはどうすればよいですか?XSLT、コンマで区切った文字列をコンマで区切って不要な要素をフィルタリングする

次のステップ(この質問の一部ではありません)では、JSONでXML2を変換する必要があります。 カンマ区切り値は、配列として表示されている必要があります。

{111, 222}; 
{456}; 
{777,555}; 
{777,555}; 
{678}; 

あなたの努力を事前に感謝そんなに、トーマス

XML1:

<transaction> 
    <records type="1" > 
     <record type="1" > 
     <field number="1" > 
      <subfield> 
       <item>111</item> 
       <item>222</item> 
      </subfield> 
     </field> 
     <field number="2" > 
      <subfield> 
       <item>456</item> 
      </subfield> 
     </field> 
     </record> 
    </records> 

    <records type="14" > 
     <record type="14" > 
     <field number="1" > 
      <subfield> 
       <item>777</item> 
       <item>555</item> 
      </subfield> 
     </field> 
     <field number="2" > 
      <subfield> 
       <item>678</item> 
      </subfield> 
     </field> 
     </record> 
    </records> 
</transaction> 

XML 2:

<transaction> 
    <records type="1" > 
     <record type="1" > 
     <field number="1" >111,222</subfield> 
     </field> 
     <field number="2" >456</field> 
     </record> 
    </records> 

    <records type="14" > 
     <record type="14" > 
     <field number="1" >777,555</field> 
     <field number="2" >678</field> 
     </record> 
    </records> 
</transaction> 
+0

これまでに何を試しましたか? –

+0

実際、私はこれをJavaで解決しようとしました。しかし、1.5日後、私はそれが本当に良いアプローチではないことに気付きました。私はXSLTの全く新しい初心者なので、私は正しい方向に私を置くいくつかのヒントを期待しました。おかげで、トーマス – ThomasMuller

答えて

2

まず、XSLTに関する良い本を見つけて、それの広告。提案についてはWhere can I find a good tutorial on XSLT files?を参照してください。代わりに第二に、アイデンティティーテンプレートについて学ぶ

....

それと
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

、あなたはそこに半分の方法があります! subfield要素の変換について心配する必要があるだけです。つまり、item個のノードを選択するsubfieldに一致するテンプレートを追加するだけです。

<xsl:template match="subfield"> 
    <xsl:for-each select="item"> 
     <xsl:if test="position() > 1">,</xsl:if> 
     <xsl:value-of select="." /> 
    </xsl:for-each> 
</xsl:template> 

それとも、より良いまだ、あなたがXSLT 2.0を使用することができれば、これを行う...

<xsl:template match="subfield"> 
    <xsl:value-of select="item" separator="," /> 
</xsl:template> 

これはしかしfieldにつき1 subfieldを前提としてい

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:strip-space elements="*" /> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="subfield"> 
     <xsl:value-of select="item" separator="," /> 
    </xsl:template> 
</xsl:stylesheet> 

このXSLTを試してみてください。

+0

こんにちはティム、 あなたと他の良い人々はここで悲惨から私を救います。 ありがとう、私の友達! XSLTの性質、主にすべてのテンプレートの母親の意味を理解し始めています。 ' ..' 他のヒントやリンクに感謝します。 よろしくお願いします。 Thomas --- 実際、私はXSLTを開発することになっていませんでしたが、RESTfulなWebサービスを開発することになっていました。 そして2週間以内に私は高水準のXSLT 1.0,2.0,3.0を学び、複雑なテンプレートを実現しなければなりません! 週末まで2日間。 今週何とか生き残らなければなりません:-) – ThomasMuller

+0

''を使ったスタイルシートの 'version'は' 2.0'ですか? Thomasは他の場所でXSLT 3.0を使用していたようで、アイデンティティテンプレートはそのバージョンで ''としてよりコンパクトに表現することができました。 –

+0

バージョン番号の問題を指摘してくれてありがとう。私は私の答えを修正しました。 –

関連する問題