2017-01-12 14 views
0

XMLをフラットファイルに変換しようとしています。 XML入力は次のとおりです。XSLTを使用してフラットファイル出力を特定の順序で生成する

<PartsPriceListLine> 
    <PartsProductItem> 
     <ItemID>1234</ItemID> 
     <PartName>abcd</PartName> 
     <PartItemDescription>test</PartItemDescription> 
    </PartsProductItem> 
    <Price> 
     <PriceCode>List</PriceCode> 
     <ChargeAmount>544.04</ChargeAmount> 
    </Price> 
    <Price> 
     <PriceCode>TradeIn</PriceCode> 
     <ChargeAmount>489.64</ChargeAmount> 
    </Price> 
    <Price> 
     <PriceCode>Sold</PriceCode> 
     <ChargeAmount>408.03</ChargeAmount> 
    </Price> 
</PartsPriceListLine> 

PriceCode値は任意の順序で来ることができましたPriceCode値はときTradePrice列に、「販売」されたとき、しかし、出力ファイルは常にDailyPrice列に割り当てられChargeAmountの値を持つ必要がありますPriceCodeの値が 'TradeIn'であり、PriceCodeの値が 'List'の場合、ListPriceの列になります。私は以下のようにXSLTを書かれている

:上記のコードで

  <xsl:for-each select="s2:PartsPriceListLine/s2:Price"> 
 
      <xsl:variable name="PriceCode" select="string(s2:PriceCode/text())"/> 
 
\t \t \t <xsl:variable name="ChargeAmount" select="string(s2:ChargeAmount/text())"/> 
 
\t \t \t 
 
      <xsl:choose> 
 
\t \t \t <xsl:when test = "$PriceCode = 'Sold'"> 
 
\t \t \t <DAILY_PRICE> 
 
\t \t \t 
 
       <xsl:value-of select="concat($ChargeAmount,',')" /> 
 
      </DAILY_PRICE> 
 
\t \t \t </xsl:when> 
 
\t \t \t </xsl:choose> 
 
\t \t \t <xsl:choose> 
 
\t \t \t <xsl:when test = "$PriceCode = 'Trade-In'"> 
 
\t \t \t <TRADE_PRICE> 
 
       <xsl:value-of select="concat($ChargeAmount,',')" /> 
 
      </TRADE_PRICE> 
 
\t \t \t </xsl:when> 
 
\t \t \t </xsl:choose> 
 
\t \t \t <xsl:choose> 
 
\t \t \t <xsl:when test = "$PriceCode = 'List'"> 
 
\t \t \t <LIST_PRICE> 
 
       <xsl:value-of select="concat($ChargeAmount,',')" /> 
 
      </LIST_PRICE> 
 
\t \t \t </xsl:when> 
 
\t \t \t </xsl:choose> 
 
\t  </xsl:for-each>

は、値は、それらがXML入力ファイルに記載されているために、出力に入力されています。

上記XSLTのために出力される。

DAILY_PRICE、TRADE_PRICE、LIST_PRICE

544.04,489.64,408.03

期待される結果であるのに対し:

DAILY_PRICE、 TRADE_PRICE、LIST_PRICE

408.03,489.64,544.04

出力は任意のヘッダー/列名を必要としませんのでご注意ください。

この点に関する任意のポインタ/ヘルプがありがとうございます。

答えて

0

私はこれを正しく読めば、あなたがしたい:ポインタのための

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:template match="PartsPriceListLine"> 
    <xsl:value-of select="Price[PriceCode='Sold']/ChargeAmount" /> 
    <xsl:text>,</xsl:text> 
    <xsl:value-of select="Price[PriceCode='TradeIn']/ChargeAmount" /> 
    <xsl:text>,</xsl:text> 
    <xsl:value-of select="Price[PriceCode='List']/ChargeAmount" /> 
    <xsl:text>&#10;</xsl:text> 
</xsl:template> 

</xsl:stylesheet> 
+0

おかげで、私は少し異なるコードでタスクを達成するために管理しました。私はノードごとに各ループを適用し、条件をチェックする場合はxslを使用しました。あなたのコメントは役に立ちました。 –

関連する問題