XSLT将动态XML转换为CSV并且XML节点不是完全重复的II

时间:2017-03-01 14:55:46

标签: csv xslt

我正在尝试创建一个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

谢谢,

马赫什。

2 个答案:

答案 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>&#xa;</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&#10;</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>&#10;</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>&#10;</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