【问题标题】:For each in XSLT loops through only first recordFor each in XSLT 仅循环通过第一条记录
【发布时间】:2020-09-04 03:51:13
【问题描述】:

尝试将 XML 转换为 CSV 以获取下面的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<Envelope xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message">
   <Header>
      <MessageId>{70BF3A9B-9111-48D8-93B4-C6232E74307F}</MessageId>
      <Action>http://tempuri.org/example/find</Action>
   </Header>
   <Body>
      <MessageParts>
         <Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.02" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <pain.001.001.02>
               <GrpHdr>
                  <MsgId>AB01029407</MsgId>
                  <CreDtTm>2020-05-07T11:23:08</CreDtTm>
                  <NbOfTxs>2</NbOfTxs>
                  <CtrlSum>4598</CtrlSum>
                  <Grpg>MIXD</Grpg>
                  <InitgPty>
                     <Nm>MY COMPANY Ltd1</Nm>
                     <Id>
                        <OrgId>
                           <TaxIdNb>GB 823825133</TaxIdNb>
                        </OrgId>
                     </Id>
                  </InitgPty>
               </GrpHdr>
               <PmtInf>
                  <PmtInfId>AB01029407</PmtInfId>
                  <PmtMtd>TRF</PmtMtd>
                  <PmtTpInf>
                     <SvcLvl>
                        <Cd>SEPA</Cd>
                     </SvcLvl>
                  </PmtTpInf>
                  <Dbtr>
                     <Nm>MY COMPANY Ltd</Nm>
                     <PstlAdr>
                        <AdrLine>Address Line 1</AdrLine>
                        <AdrLine>Address Line 2</AdrLine>
                        <Ctry>CB</Ctry>
                     </PstlAdr>
                  </Dbtr>
                  <DbtrAcct>
                     <Id>
                        <IBAN>98</IBAN>
                     </Id>
                  </DbtrAcct>
                  <DbtrAgt>
                     <FinInstnId>
                        <BIC>ABC123</BIC>
                     </FinInstnId>
                  </DbtrAgt>
                  <ChrgBr>SLEV</ChrgBr>
                  <CdtTrfTxInf>
                     <PmtId>
                        <EndToEndId>Not-Provided</EndToEndId>
                     </PmtId>
                     <Amt>
                        <InstdAmt Ccy="CAD">2198.00</InstdAmt>
                     </Amt>
                     <CdtrAgt>
                        <FinInstnId>
                           <BIC>SWIFT01</BIC>
                        </FinInstnId>
                     </CdtrAgt>
                     <Cdtr>
                        <Nm>Creditor Name</Nm>
                        <PstlAdr>
                           <AdrLine>tests</AdrLine>
                           <AdrLine>Chicago</AdrLine>
                           <Ctry>US</Ctry>
                        </PstlAdr>
                     </Cdtr>
                     <CdtrAcct>
                        <Id>
                           <IBAN>98</IBAN>
                        </Id>
                     </CdtrAcct>
                     <RmtInf>
                        <Ustrd>1345</Ustrd>
                     </RmtInf>
                  </CdtTrfTxInf>
                  <CdtTrfTxInf>
                     <PmtId>
                        <EndToEndId>Not-Provided</EndToEndId>
                     </PmtId>
                     <Amt>
                        <InstdAmt Ccy="EUR">2400.00</InstdAmt>
                     </Amt>
                     <CdtrAgt>
                        <FinInstnId>
                           <BIC>SWIFT01</BIC>
                        </FinInstnId>
                     </CdtrAgt>
                     <Cdtr>
                        <Nm>Creditor Name1</Nm>
                        <PstlAdr>
                           <AdrLine>tests</AdrLine>
                           <AdrLine>Chicago</AdrLine>
                           <Ctry>US</Ctry>
                        </PstlAdr>
                     </Cdtr>
                     <CdtrAcct>
                        <Id>
                           <IBAN>98</IBAN>
                        </Id>
                     </CdtrAcct>
                     <RmtInf>
                        <Ustrd>123456765</Ustrd>
                     </RmtInf>
                  </CdtTrfTxInf>
               </PmtInf>
            </pain.001.001.02>
         </Document>
      </MessageParts>
   </Body>
</Envelope> 

我用过的XSLT是:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="http://schemas.microsoft.com/dynamics/2011/01/documents/Message"
xmlns:ns2="urn:iso:std:iso:20022:tech:xsd:pain.001.001.02">
<xsl:output method="text"/>  
<xsl:template match="/ns1:Envelope">
<xsl:variable name="Delimiter" select="','"></xsl:variable>
<xsl:variable name="header" select="ns1:Body/ns1:MessageParts/ns2:Document/ns2:pain.001.001.02/ns2:GrpHdr" />
<xsl:variable name="pmt" select="ns1:Body/ns1:MessageParts/ns2:Document/ns2:pain.001.001.02/ns2:PmtInf" />
<xsl:variable name="headerText" 
select="concat($header/ns2:MsgId,',',
$header/ns2:CreDtTm,',',
$header/ns2:NbOfTxs,',',
$header/ns2:CtrlSum,',',
$header/ns2:Grpg,',',
$header/ns2:InitgPty/ns2:Nm,',',
$header/ns2:InitgPty/ns2:Id/ns2:OrgId/ns2:TaxIdNb)"/>
<xsl:variable name="pmtText" 
select="concat($pmt/ns2:PmtInfId,',',
$pmt/ns2:PmtMtd,',',
$pmt/ns2:PmtTpInf/ns2:SvcLvl/ns2:Cd,',',
$pmt/ns2:Dbtr/ns2:Nm,',',
$pmt/ns2:Dbtr/ns2:PstlAdr/ns2:AdrLine[1],',',
$pmt/ns2:Dbtr/ns2:PstlAdr/ns2:AdrLine[2],',',
$pmt/ns2:Dbtr/ns2:PstlAdr/ns2:Ctry,',',
$pmt/ns2:DbtrAcct/ns2:Id/ns2:IBAN,',',
$pmt/ns2:DbtrAgt/ns2:FinInstnId/ns2:BIC,',',
$pmt/ns2:ChrgBr)"/>
<xsl:variable name="CdtTrfTxInfText"
select="concat($pmt/ns2:CdtTrfTxInf/ns2:PmtId/ns2:EndToEndId,',',
$pmt/ns2:CdtTrfTxInf/ns2:Amt/ns2:InstdAmt,',',
$pmt/ns2:CdtTrfTxInf/ns2:CdtrAgt/ns2:FinInstnId/ns2:BIC,',',
$pmt/ns2:CdtTrfTxInf/ns2:Cdtr/ns2:Nm,',',
$pmt/ns2:CdtTrfTxInf/ns2:Cdtr/ns2:PstlAdr/ns2:AdrLine[1],',',
$pmt/ns2:CdtTrfTxInf/ns2:Cdtr/ns2:PstlAdr/ns2:AdrLine[2],',',
$pmt/ns2:CdtTrfTxInf/ns2:Cdtr/ns2:PstlAdr/ns2:Ctry,',',
$pmt/ns2:CdtTrfTxInf/ns2:CdtrAcct/ns2:Id/ns2:IBAN,',',
$pmt/ns2:CdtTrfTxInf/ns2:RmtInf/ns2:Ustrd)"/>
<xsl:for-each select="$pmt/ns2:CdtTrfTxInf">
<xsl:value-of select="$headerText"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="$pmtText"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="$CdtTrfTxInfText"/>
<xsl:text>&#xa;</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

我得到如下输出:

AB01029407,2020-05-07T11:23:08,2,4598,MIXD,MY COMPANY Ltd1,GB 823825133,AB01029407,TRF,SEPA,MY COMPANY Ltd,Address Line 1,Address Line 2,CB,98, ABC123,SLEV,Not-Provided,2198.00,SWIFT01,Creditor Name,tests,Chicago,US,98,1345

AB01029407,2020-05-07T11:23:08,2,4598,MIXD,MY COMPANY Ltd1,GB 823825133,AB01029407,TRF,SEPA,MY COMPANY Ltd,Address Line 1,Address Line 2,CB,98, ABC123,SLEV,Not-Provided,2198.00,SWIFT01,Creditor Name,tests,Chicago,US,98,1345

期望的输出是:

AB01029407,2020-05-07T11:23:08,2,4598,MIXD,MY COMPANY Ltd1,GB 823825133,AB01029407,TRF,SEPA,MY COMPANY Ltd,Address Line 1,Address Line 2,CB,98,ABC123,SLEV,Not-Provided,2198.00,SWIFT01,Creditor Name,tests,Chicago,US,98,1345
AB01029407,2020-05-07T11:23:08,2,4598,MIXD,MY COMPANY Ltd1,GB 823825133,AB01029407,TRF,SEPA,MY COMPANY Ltd,Address Line 1,Address Line 2,CB,98,ABC123,SLEV,Not-Provided,2400.00,SWIFT01,Creditor Name1,tests,Chicago,US,98,123456765

您能否纠正这个,无法理解我在哪里做错了。

谢谢

【问题讨论】:

  • 你能准确说明你得到的输出有什么问题吗?此外,尚不清楚“实际”输出是否为换行。您可以编辑使其成为代码引用吗?

标签: xml loops csv xslt foreach


【解决方案1】:

我发现这些无穷无尽的concat() 语句无法阅读。我建议您将它们更改为以下形式的明确说明:

<xsl:variable name="headerText">
    <xsl:value-of select="$header/ns2:MsgId"/>
    <xsl:text>,</xsl:text>
    <!-- ... -->
</xsl:variable>

一些缩进也有助于提高可读性。


无论如何,您的错误是在xsl:for-each 指令之外定义了$CdtTrfTxInfText 变量。这将使用来自第一个 CdtTrfTxInf 节点的值填充变量 - 然后您只需为每次出现 CdtTrfTxInf 重复这些值。

尝试摆脱变量并直接从xsl:for-each指令中的当前节点获取值:

<xsl:for-each select="$pmt/ns2:CdtTrfTxInf">
    <xsl:value-of select="$headerText"/>
    <xsl:text>,</xsl:text>
    <xsl:value-of select="$pmtText"/>
    <xsl:text>,</xsl:text>
    <xsl:value-of select="concat(
    ns2:PmtId/ns2:EndToEndId,',',
    ns2:Amt/ns2:InstdAmt,',',
    ns2:CdtrAgt/ns2:FinInstnId/ns2:BIC,',',
    ns2:Cdtr/ns2:Nm,',',
    ns2:Cdtr/ns2:PstlAdr/ns2:AdrLine[1],',',
    ns2:Cdtr/ns2:PstlAdr/ns2:AdrLine[2],',',
    ns2:Cdtr/ns2:PstlAdr/ns2:Ctry,',',
    ns2:CdtrAcct/ns2:Id/ns2:IBAN,',',
    ns2:RmtInf/ns2:Ustrd)"/>
    <xsl:text>&#xa;</xsl:text>
</xsl:for-each>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 2012-05-17
    • 1970-01-01
    • 2018-10-22
    相关资源
    最近更新 更多