2016-12-14 21 views
0
<?xml version="1.0" encoding="UTF-8"?> 
<FirstTag version="1.0" createTime="15:59:59" DATE="20161209"> 
    <SecondTag Name="House01"> 
    <a> 
     <Furniture FURN_ID="FUR00001" FURN_AMT="2" price="10000"/> 
     <Furniture FURN_ID="FUR00002" FURN_AMT="1" price="20000"/> 
    </a> 
    <b> 
     <Furniture FURN_ID="FUR00001" FURN_AMT="2" price="30000"/> 
     <Furniture FURN_ID="FUR00003" FURN_AMT="1" price="40000"/> 
    </b> 
    <c> 
     <Furniture FURN_ID="FUR00002" FURN_AMT="2" price="50000"/> 
     <Furniture FURN_ID="FUR00003" FURN_AMT="1" price="60000"/> 
    </c> 
    <d> 
     <Furniture FURN_ID="FUR00001" FURN_AMT="1" price="70000"/> 
     <Furniture FURN_ID="FUR00002" FURN_AMT="2" price="80000"/> 
    </d> 
    <e> 
     <Furniture FURN_ID="FUR00002" FURN_AMT="1" price="90000"/> 
     <Furniture FURN_ID="FUR00003" FURN_AMT="2" price="100000"/> 
    </e> 
    <f> 
     <Furniture FURN_ID="FUR00001" FURN_AMT="1" price="110000"/> 
     <Furniture FURN_ID="FUR00002" FURN_AMT="2" price="120000"/> 
     <Furniture FURN_ID="FUR00003" FURN_AMT="2" price="120000"/> 
    </f> 
    </SecondTag> 
</FirstTag> 

上記は、Javaプログラムから作成した単純なxml(ノード値付き)です。ポイントは、このxmlデータをUI /バッチプロセスからのcsvロード機能がある別のアプリケーションに送信したいと思います。私はXSLTについて聞いたことがありますが、それを使用しないで、チュートリアルのいくつかを試しましたが、csvにすべての値を取得する時間に混乱しました。ここで XMLからCSVへの変換

は(いくつかの計算を行う必要があり、成功した後、起動する)ことは、CSVでどのように見えるかです:1家(HOUSE01)この例では

sample row csv

私は、出力したいすべての別の部屋の家具(すなわち、部屋1、bは部屋2、cは部屋3など)。私はXSLTを構築しようとしてきた

、以下のXSLTです:

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

    <xsl:template match="/"> 
    <xsl:text>Name,Furn_Id,a,b,c,d,e,f 
</xsl:text> 
    <xsl:variable name="delimiter" select="','" /> 

    <xsl:for-each select="//SecondTag"> 
<xsl:variable name="hname" select="@Name"/> 

     <xsl:for-each select="f/Furniture"> 

      <xsl:value-of select='$hname' /> 
      <xsl:value-of select="$delimiter"/> 

      <xsl:variable name="var1" select="@FURN_ID"/> 
      <xsl:variable name="varamt1" select="@FURN_AMT"/> 

      <xsl:for-each select="//a/Furniture"> 


       <xsl:variable name="var2" select="@FURN_ID"/> 
       <xsl:variable name="varamt2" select="@FURN_AMT"/> 

       <xsl:if test="$var1 = $var2"> 

         <xsl:value-of select='$var2' /> 
         <xsl:value-of select="$delimiter"/> 
         <xsl:value-of select='$varamt2' /> 
         <xsl:value-of select="$delimiter"/> 
       </xsl:if> 

      </xsl:for-each> 

<xsl:text> 
</xsl:text> 

     </xsl:for-each> 

    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

私は別のページからいくつかの基準を使用していますし、CSVにXMLを変換するためにいくつかの簡単なXSLTを構築することができ、しかし、私は主なXML問題を解決するためにいくつかのガイダンスが必要です。

将来、ループ内にノード値を取得できたら、各部屋のすべての家具の合計価格を合計したいと思います。

Name,Furn_Id,a,b,c,d,e,f 
House01,FUR00001,20000,60000,,70000,,110000 
House01,FUR00002,20000,,100000,160000,90000,240000 
House01,FUR00003,,40000,60000,,200000,240000 

ありがとう:

は、最終的なCSV形式の結果を予想します。

Getting the value of an attribute in XML

+1

** 1。**以上の家はありますか? ** 2。**すべての家はまったく同じ「部屋」(a、b、c、d、e、f)を持っていますか? ** 3。**どのXSLTプロセッサを使用しますか? –

+0

@ michael.hor257k 1.XSLT 1.0 – Nico

+0

XSLT 1.0プロセッサは具体的にどのようなものですか?プロセッサがサポートしている場合は、ここで拡張機能を使用できます。 –

答えて

1

あなたは現在の家の中で各個別FURN_IDの行をしたい(あるいは少なくともそれは、与えられた例かららしい)ので、これは、それが見えるかもしれませんよりも複雑です。したがって、最初の作業はこれらの別個の値を見つけることです。FURN_ID

OTOH、各家は正確に同じ6室を有する場合、その一致する列見出しの下に各家具を示すの第2のタスクは、はるかに簡単である:に適用

XSLT 1.0

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

<xsl:key name="furn" match="Furniture" use="concat(@FURN_ID, '|', ../../@Name)" /> 

<xsl:template match="/FirstTag"> 
    <xsl:for-each select="SecondTag"> 
     <xsl:variable name="columns" select="*" /> 
     <xsl:variable name="unique-rows" select="*/Furniture[count(. | key('furn', concat(@FURN_ID, '|', ../../@Name))[1]) = 1]"/> 
     <!-- header --> 
     <xsl:text>Name,Furn_Id,a,b,c,d,e,f&#10;</xsl:text> 
     <!-- rows --> 
     <xsl:for-each select="$unique-rows"> 
      <xsl:value-of select="../../@Name"/> 
      <xsl:text>,</xsl:text> 
      <xsl:value-of select="@FURN_ID"/> 
      <xsl:text>,</xsl:text> 
      <xsl:variable name="id" select="@FURN_ID" /> 
      <xsl:for-each select="$columns"> 
       <xsl:variable name="cell" select="Furniture[@FURN_ID=$id]" /> 
       <xsl:if test="$cell"> 
        <xsl:value-of select="$cell/@FURN_AMT * $cell/@price"/> 
       </xsl:if> 
       <xsl:if test="position()!=last()"> 
        <xsl:text>,</xsl:text> 
       </xsl:if> 
      </xsl:for-each> 
      <xsl:text>&#10;</xsl:text> 
     </xsl:for-each> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

あなたの入力例では、結果は次のようになります:

Name,Furn_Id,a,b,c,d,e,f 
House01,FUR00001,20000,60000,,70000,,110000 
House01,FUR00002,20000,,100000,160000,90000,240000 
House01,FUR00003,,40000,60000,,200000,240000 

これは予想される出力と少し異なりますが、私はそれが正しいと信じてください。

+0

確かに、私はFUR00002の部屋の価格を勘案しなければなりません。あなたの出力のように240000でなければなりません。これは合法的です! – Nico