我需要使用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>
答案 0 :(得分:1)
尝试查看此问题但请使用|而不是逗号
答案 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似乎很奇怪,因为所有GeneralLedgerReport
,ReportCreatedTime
,PeriodStartTime
和PeriodEndTime
标记都在同一级别上;也许你有一些标签将它们包围起来,这样你就可以为每个GeneralLedgerReport
我希望这会有所帮助。