我正在尝试创建一个XSLT来将XML转换为CSV。这里放置我的XML和预期输出任何人都知道如何获得以下输出请优先分享我。
我的XML是
<SttlmOblgtnRpt>
<RptDtls>
<SttlmOblgtnDtls>
<SttlmOblgtnId>A</SttlmOblgtnId>
<FinInstrmId>
<OthrId>
<Id>SETTLE</Id>
<Tp>
<Cd>CO</Cd>
</Tp>
</OthrId>
</FinInstrmId>
<IntnddSttlmDt>
<Dt>
<Dt>2011-11-11</Dt>
</Dt>
</IntnddSttlmDt>
<Qty>
<Unit>11</Unit>
</Qty>
<SttlmAmt>
<Amt Ccy="ZAR">20.00</Amt>
</SttlmAmt>
<PlcOfTrad>
<Id>
<Desc>SA</Desc>
</Id>
<Tp>
<Cd>PR</Cd>
</Tp>
</PlcOfTrad>
<Pmt>Fail</Pmt>
<AddtlSttlmOblgtnDtls>
<RltdSttlmOblgtnId>Debit</RltdSttlmOblgtnId>
<Qty>
<Unit>200</Unit>
</Qty>
<SttlmAmt>
<Amt Ccy="ZAR">22.00</Amt>
</SttlmAmt>
<SttlmDt>2011-11-11</SttlmDt>
<SctiesMvmntTp>INDIA</SctiesMvmntTp>
<Pmt>MT</Pmt>
</AddtlSttlmOblgtnDtls>
<AddtlSttlmOblgtnDtls>
<RltdSttlmOblgtnId>Outward</RltdSttlmOblgtnId>
<Qty>
<Unit>1</Unit>
</Qty>
<SttlmAmt>
<Amt Ccy="ZAR">100.00</Amt>
</SttlmAmt>
<SttlmDt>2015-12-01</SttlmDt>
<SctiesMvmntTp>UK</SctiesMvmntTp>
<Pmt>EMP</Pmt>
</AddtlSttlmOblgtnDtls>
</SttlmOblgtnDtls>
</RptDtls>
<RptDtls>
<SttlmOblgtnDtls>
<SttlmOblgtnId>B</SttlmOblgtnId>
<FinInstrmId>
<OthrId>
<Id>UNSETTLE</Id>
<Tp>
<Cd>MM</Cd>
</Tp>
</OthrId>
</FinInstrmId>
<IntnddSttlmDt>
<Dt>
<Dt>2012-12-12</Dt>
</Dt>
</IntnddSttlmDt>
<Qty>
<Unit>22</Unit>
</Qty>
<SttlmAmt>
<Amt Ccy="ZAR">60.00</Amt>
</SttlmAmt>
<PlcOfTrad>
<Id>
<Desc>RB</Desc>
</Id>
<Tp>
<Cd>IM</Cd>
</Tp>
</PlcOfTrad>
<Pmt>Ok</Pmt>
<AddtlSttlmOblgtnDtls>
<RltdSttlmOblgtnId>Credit</RltdSttlmOblgtnId>
<Qty>
<Unit>100</Unit>
</Qty>
<SttlmAmt>
<Amt Ccy="ZAR">66.00</Amt>
</SttlmAmt>
<SttlmDt>2012-12-12</SttlmDt>
<SctiesMvmntTp>DELHI</SctiesMvmntTp>
<Pmt>AP</Pmt>
</AddtlSttlmOblgtnDtls>
<AddtlSttlmOblgtnDtls>
<RltdSttlmOblgtnId>Value</RltdSttlmOblgtnId>
<Qty>
<Unit>111</Unit>
</Qty>
<SttlmAmt>
<Amt Ccy="ZAR">666.00</Amt>
</SttlmAmt>
<SttlmDt>2001-05-05</SttlmDt>
<SctiesMvmntTp>US</SctiesMvmntTp>
<Pmt>PASS</Pmt>
</AddtlSttlmOblgtnDtls>
</SttlmOblgtnDtls>
</RptDtls> </SttlmOblgtnRpt>
我的预期输出是
SttlmOblgtnId,PMT,ID,镉,DT,单位,金额,商品说明,镉,RltdSttlmOblgtnId,SttlmDt,SctiesMvmntTp,PMT,单元,金额
A,故障,沉降,CO,11/11 / 2011,11,20,SA,PR,借记,11/11/2011年,印度,MT,200,22
,,,,,,,,,外向12/1/2015年,英国,EMP,1100
B,好的,扰乱,MM,12/12 / 2012,22,60,RB,IM,信用,12/12/2012年,新德里,AP,100,66
,,,,,,,,,值,10/10/2001年,美国,PASS,111666
谢谢,
马赫什。
答案 0 :(得分:0)
你可以用这个
<xsl:template match="RptDtls">
<xsl:for-each select="descendant::AddtlSttlmOblgtnDtls">
<xsl:variable name="pos" select="position()"/>
<xsl:value-of select="parent::SttlmOblgtnDtls/SttlmOblgtnId[$pos]"/><xsl:text>,</xsl:text>
<xsl:value-of select="parent::SttlmOblgtnDtls/Pmt[$pos]"/><xsl:text>,</xsl:text>
<xsl:value-of select="parent::SttlmOblgtnDtls/FinInstrmId[$pos]/OthrId/Id"/><xsl:text>,</xsl:text>
<xsl:value-of select="parent::SttlmOblgtnDtls/FinInstrmId[$pos]/OthrId/Tp/Cd"/><xsl:text>,</xsl:text>
<xsl:value-of select="replace(parent::SttlmOblgtnDtls/IntnddSttlmDt[$pos]/Dt/Dt, '([\d]{4})-0?([\d]{1,2})-0?([\d]{1,2})', '$2/$3/$1')"/><xsl:text>,</xsl:text>
<xsl:value-of select="parent::SttlmOblgtnDtls/Qty[$pos]/Unit"/><xsl:text>,</xsl:text>
<xsl:if test="normalize-space(parent::SttlmOblgtnDtls/SttlmAmt[$pos]/Amt) !=''">
<xsl:value-of select="format-number(parent::SttlmOblgtnDtls/SttlmAmt[$pos]/Amt, '0')"/>
</xsl:if><xsl:text>,</xsl:text>
<xsl:value-of select="parent::SttlmOblgtnDtls/PlcOfTrad[$pos]/Id/Desc"/><xsl:text>,</xsl:text>
<xsl:value-of select="parent::SttlmOblgtnDtls/PlcOfTrad[$pos]/Tp/Cd"/><xsl:text>,</xsl:text>
<xsl:value-of select="RltdSttlmOblgtnId"/><xsl:text>,</xsl:text>
<xsl:value-of select="replace(SttlmDt, '([\d]{4})-0?([\d]{1,2})-0?([\d]{1,2})', '$2/$3/$1')"/><xsl:text>,</xsl:text>
<xsl:value-of select="SctiesMvmntTp"/><xsl:text>,</xsl:text>
<xsl:value-of select="Pmt"/><xsl:text>,</xsl:text>
<xsl:value-of select="Qty/Unit"/><xsl:text>,</xsl:text>
<xsl:value-of select="format-number(SttlmAmt/Amt, '0')"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
输出
A,Fail,SETTLE,CO,11/11/2011,11,20,SA,PR,Debit,11/11/2011,INDIA,MT,200,22
,,,,,,,,,Outward,12/1/2015,UK,EMP,1,100
B,Ok,UNSETTLE,MM,12/12/2012,22,60,RB,IM,Credit,12/12/2012,DELHI,AP,100,66
,,,,,,,,,Value,5/5/2001,US,PASS,111,666
答案 1 :(得分: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="/SttlmOblgtnRpt">
<!-- header -->
<xsl:text>SttlmOblgtnId,Pmt,Id,Cd,Dt,Unit,Amt,Desc,Cd,RltdSttlmOblgtnId,SttlmDt,SctiesMvmntTp,Pmt,Unit,Amt </xsl:text>
<!-- data -->
<xsl:for-each select="RptDtls/SttlmOblgtnDtls">
<!-- first row -->
<xsl:value-of select="SttlmOblgtnId" />
<xsl:text>,</xsl:text>
<xsl:value-of select="Pmt" />
<xsl:text>,</xsl:text>
<xsl:value-of select="FinInstrmId/OthrId/Id" />
<xsl:text>,</xsl:text>
<xsl:value-of select="FinInstrmId/OthrId/Tp/Cd" />
<xsl:text>,</xsl:text>
<xsl:value-of select="IntnddSttlmDt/Dt/Dt" />
<xsl:text>,</xsl:text>
<xsl:value-of select="Qty/Unit" />
<xsl:text>,</xsl:text>
<xsl:value-of select="SttlmAmt/Amt" />
<xsl:text>,</xsl:text>
<xsl:value-of select="PlcOfTrad/Id/Desc" />
<xsl:text>,</xsl:text>
<xsl:value-of select="PlcOfTrad/Tp/Cd" />
<xsl:text>,</xsl:text>
<!-- first AddtlSttlmOblgtnDtls -->
<xsl:value-of select="AddtlSttlmOblgtnDtls[1]/RltdSttlmOblgtnId" />
<xsl:text>,</xsl:text>
<xsl:value-of select="AddtlSttlmOblgtnDtls[1]/SttlmDt" />
<xsl:text>,</xsl:text>
<xsl:value-of select="AddtlSttlmOblgtnDtls[1]/SctiesMvmntTp" />
<xsl:text>,</xsl:text>
<xsl:value-of select="AddtlSttlmOblgtnDtls[1]/Pmt" />
<xsl:text>,</xsl:text>
<xsl:value-of select="AddtlSttlmOblgtnDtls[1]/SttlmAmt/Amt" />
<xsl:text> </xsl:text>
<!-- second row -->
<xsl:text>,,,,,,,,,</xsl:text>
<xsl:value-of select="AddtlSttlmOblgtnDtls[2]/RltdSttlmOblgtnId" />
<xsl:text>,</xsl:text>
<xsl:value-of select="AddtlSttlmOblgtnDtls[2]/SttlmDt" />
<xsl:text>,</xsl:text>
<xsl:value-of select="AddtlSttlmOblgtnDtls[2]/SctiesMvmntTp" />
<xsl:text>,</xsl:text>
<xsl:value-of select="AddtlSttlmOblgtnDtls[2]/Pmt" />
<xsl:text>,</xsl:text>
<xsl:value-of select="AddtlSttlmOblgtnDtls[2]/SttlmAmt/Amt" />
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
结果:
SttlmOblgtnId,Pmt,Id,Cd,Dt,Unit,Amt,Desc,Cd,RltdSttlmOblgtnId,SttlmDt,SctiesMvmntTp,Pmt,Unit,Amt
A,Fail,SETTLE,CO,2011-11-11,11,20.00,SA,PR,Debit,2011-11-11,INDIA,MT,22.00
,,,,,,,,,Outward,2015-12-01,UK,EMP,100.00
B,Ok,UNSETTLE,MM,2012-12-12,22,60.00,RB,IM,Credit,2012-12-12,DELHI,AP,66.00
,,,,,,,,,Value,2001-05-05,US,PASS,666.00