使用XSLT进行XML到平面文件的转换

时间:2011-06-28 06:05:28

标签: xml xslt

我需要使用XSLT将以下XML转换为带有分隔符为“|”的flatfile。

这是我的XML:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?><GeneralLedgerReport targetNamespace="http://www.portal.com/schemas/GLSync" xmlns="http://www.portal.com/schemas/GLSync" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.portal.com/schemas/GLSync brm_gl_data.xsd">
        <SourceSystemID>Germany</SourceSystemID>
        <ReportID>0.0.0.1-697031-1136</ReportID>
        <RevenueType>Unbilled earned</RevenueType>
        <BRM_GL_Segment>.</BRM_GL_Segment>
        <ReportCreatedTime>
                <Year>2013</Year>
                <Month>01</Month>
                <Day>14</Day>
                <Hours>16</Hours>
                <Minutes>2</Minutes>
                <Seconds>3</Seconds>
        </ReportCreatedTime>
        <PeriodStartTime>
                <Year>2012</Year>
                <Month>10</Month>
                <Day>15</Day>
                <Hours>0</Hours>
                <Minutes>0</Minutes>
                <Seconds>0</Seconds>
        </PeriodStartTime>
        <PeriodEndTime>
                <Year>2012</Year>
                <Month>10</Month>
                <Day>16</Day>
                <Hours>0</Hours>
                <Minutes>0</Minutes>
                <Seconds>0</Seconds>
        </PeriodEndTime>
</GeneralLedgerReport>

所需输出:                                   总帐报告

德国| 0.0.0.1-697031-1136 |未开单赚| 2013/01 / 14-16:02:03 | 2012/10 / 15-00:00:00 德国| 0.0.0.1-697031-1136 |未开单收入| 2013/01 / 14-16:02:03 | 2012/10 / 15-00:00:00 德国| 0.0.0.1-697031-1136 |未开单收入| 2013/01 / 14-16:02:03 | 2012/10 / 15-00:00:00 德国| 0.0.0.1-697031-1136 |未开单收入| 2013/01 / 14-16:02:03 | 2012/10 / 15-00:00:00

我尝试了几件事,但输出如下:

Germany0.0.0.1-697031-1136Unbilled earn20130114160203201210150

迫切需要这个,请帮忙! 谢谢!

我是XSLT的新手,不知道如何使用分隔符单独获取元素,我试过这个:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common"
        xmlns:java="http://xml.apache.org/xalan/java" exclude-result-prefixes="exslt java">
<xsl:output method="text" version="1.0" encoding="ISO-8859-1" indent="yes"/>

        <xsl:template match="/">
          <xsl:apply-templates select="/"/>
        </xsl:template>
        <xsl:template match="/">
           <xsl:value-of  select="."/>
        </xsl:template>

</xsl:stylesheet>

更多XML:

    <SourceSystemID>Germany</SourceSystemID>
    <ReportID>0.0.0.1-697031-1116</ReportID>
    <RevenueType>Unbilled earned</RevenueType>
    <BRM_GL_Segment>.</BRM_GL_Segment>
    <ReportCreatedTime>
            <Year>2013</Year>
            <Month>01</Month>
            <Day>14</Day>
            <Hours>16</Hours>
            <Minutes>1</Minutes>
            <Seconds>59</Seconds>
    </ReportCreatedTime>
    <PeriodStartTime>
            <Year>2012</Year>
            <Month>09</Month>
            <Day>25</Day>
            <Hours>0</Hours>
            <Minutes>0</Minutes>
            <Seconds>0</Seconds>
    </PeriodStartTime>
    <PeriodEndTime>
            <Year>2012</Year>
            <Month>09</Month>
            <Day>26</Day>
            <Hours>0</Hours>
            <Minutes>0</Minutes>
            <Seconds>0</Seconds>
    </PeriodEndTime>
    <SourceSystemID>Germany</SourceSystemID>
    <ReportID>0.0.0.1-697031-1136</ReportID>
    <RevenueType>Unbilled earned</RevenueType>
    <BRM_GL_Segment>.</BRM_GL_Segment>
    <ReportCreatedTime>
            <Year>2013</Year>
            <Month>01</Month>
            <Day>14</Day>
            <Hours>16</Hours>
            <Minutes>2</Minutes>
            <Seconds>3</Seconds>
    </ReportCreatedTime>
    <PeriodStartTime>
            <Year>2012</Year>
            <Month>10</Month>
            <Day>15</Day>
            <Hours>0</Hours>
            <Minutes>0</Minutes>
            <Seconds>0</Seconds>
    </PeriodStartTime>
    <PeriodEndTime>
            <Year>2012</Year>
            <Month>10</Month>
            <Day>16</Day>
            <Hours>0</Hours>
            <Minutes>0</Minutes>
            <Seconds>0</Seconds>
    </PeriodEndTime>

2 个答案:

答案 0 :(得分:1)

尝试查看此问题但请使用|而不是逗号

XSLT Concatenating the values with comma (,)

答案 1 :(得分:0)

您可以从以下XSLT中获得灵感:

<?xml version='1.0' encoding='utf-8'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:glsync="http://www.portal.com/schemas/GLSync" version="1.0">

    <xsl:output method="text" />

    <xsl:template match="glsync:GeneralLedgerReport">
        <xsl:value-of select="./glsync:SourceSystemID" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="./glsync:ReportID" />
        <xsl:text>|</xsl:text>
        <xsl:value-of select="./glsync:RevenueType" />
        <xsl:text>|</xsl:text>
        <xsl:apply-templates select="./glsync:ReportCreatedTime" />
        <xsl:text>|</xsl:text>
        <xsl:apply-templates select="./glsync:PeriodStartTime" />
    </xsl:template>

    <xsl:template match="glsync:ReportCreatedTime">
        <xsl:value-of
            select="concat(
                glsync:Year, '/', 
                glsync:Month, '/', 
                glsync:Day, '-', 
                format-number(glsync:Hours, '00'), ':', 
                format-number(glsync:Minutes, '00'), ':', 
                format-number(glsync:Seconds,  '00'))" />
    </xsl:template>

    <xsl:template match="glsync:PeriodStartTime">
        <xsl:value-of
            select="concat(
                glsync:Year, '/', 
                glsync:Month, '/', 
                glsync:Day, '-', 
                format-number(glsync:Hours, '00'), ':', 
                format-number(glsync:Minutes, '00'), ':', 
                format-number(glsync:Seconds,  '00'))" />
    </xsl:template>

</xsl:stylesheet>

一些注意事项:

  • 您必须在匹配元素中使用命名空间,因为您的XML有targetNamespace;

  • 您也可以在匹配concat

  • 的模板中使用glsync:GeneralLedgerReport功能
  • 请注意使用format-number功能获取两位数的小时,分​​钟和秒数

  • 最后,您更长的XML似乎很奇怪,因为所有GeneralLedgerReportReportCreatedTimePeriodStartTimePeriodEndTime标记都在同一级别上;也许你有一些标签将它们包围起来,这样你就可以为每个GeneralLedgerReport

  • 设置嵌套结构

我希望这会有所帮助。