2017-01-12 41 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值可以派上任何順序,但是,輸出文件應始終分配給DailyPrice列ChargeAmount的值時PriceCode值「已售出」,以TradePrice列時當PriceCode值爲'List'時,PriceCode值爲'TradeIn'和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來檢查條件。您的評論有幫助。 –