使用XSLT以特定顺序生成平面文件输出

时间:2017-01-12 08:21:42

标签: xml csv if-statement xslt foreach

我正在尝试将XML转换为平面文件。 XML输入是:

<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值为“已售出”时,输出文件应始终具有分配给DailyPrice列的ChargeAmount值;当PriceCode值为“TradeIn”时,输出文件应始终具有分配给TradePrice列的值和ListPrice当PriceCode值为'List'时的列。

我写过XSLT如下:

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

请注意输出不需要任何页眉/列名称。

赞赏这方面的任何指针/帮助。

1 个答案:

答案 0 :(得分: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>