【问题标题】:Generating Flat file output in specific order using XSLT使用 XSLT 按特定顺序生成平面文件输出
【发布时间】:2017-05-27 06:23:22
【问题描述】:

我正在尝试将 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 值为“Sold”时,输出文件应始终将 ChargeAmount 值分配给 DailyPrice 列,当 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

请注意,输出不需要任何标题/列名。

感谢您提供这方面的任何指针/帮助。

【问题讨论】:

    标签: xml csv if-statement xslt foreach


    【解决方案1】:

    如果我没看错,你想这样做:

    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>
    

    【讨论】:

    • 感谢您的指点,我设法用稍微不同的代码完成了任务。我为每个节点申请了每个循环,然后使用 xsl if 检查条件。您的评论很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    相关资源
    最近更新 更多