Pushpa
Pushpa

Reputation: 13

<xsl:for-each> repeats first row

Below is what my XML looks like. I have also copied XSLT and output below. My problem is that, the output is always repeating the same first row. If I add more rows to input XML file then first row would repeat in output file for that many number of rows added. What could be the reason?

XML:

<Loans>
    <Loan>
        <loan_number>123</loan_number>
        <loan_aqn_date>08-01-2016</loan_number>
    </Loan>
    <Loan>
        <loan_number>456</loan_number>
        <loan_aqn_date>10-01-2016</loan_number>
    </Loan>
    <Loan>
        <loan_number>789</loan_number>
        <loan_aqn_date>12-01-2016</loan_number>
    </Loan>
</Loans>

Output:

loan_number|loan_aqn_date|
123|08-01-2016|
123|08-01-2016|
123|08-01-2016|

XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" />
    <xsl:template match="/">
        <xsl:text>loan_number|loan_aqn_date|</xsl:text>
        <xsl:for-each select="/Loans/Loan">
            <xsl:value-of select="concat(/Loans/Loan/loan_number,'|')" />
            <xsl:value-of select="concat(/Loans/Loan/loan_aqn_date,'|')" />
        </xsl:for-each>
    </xsl:template>    
</xsl:stylesheet>

Upvotes: 1

Views: 1161

Answers (2)

zx485
zx485

Reputation: 29022

Replacing the <for-each> with a template could make your approach more general.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" />
  <xsl:strip-space elements="Loans" />     <!-- Removes surrounding spaces -->

  <xsl:template match="/Loans">
    <xsl:text>loan_number|loan_aqn_date|&#10;</xsl:text>
    <xsl:apply-templates />                <!-- Processes 'Loan' nodes -->
  </xsl:template>    

  <xsl:template match="Loan">
    <xsl:value-of select="concat(loan_number, '|', loan_aqn_date,'|')" />
    <xsl:text>&#10;</xsl:text>             <!-- Adds newlines -->
  </xsl:template>    
</xsl:stylesheet>

Output:

loan_number|loan_aqn_date|
123|08-01-2016|
456|10-01-2016|
789|12-01-2016|

Upvotes: 0

Rafael Z.
Rafael Z.

Reputation: 1162

You are using an absolute path for "select" inside loop. Try this:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:template match="/">
        <xsl:text>loan_number|loan_aqn_date|</xsl:text>
        <xsl:for-each select="/Loans/Loan">
            <xsl:value-of select="concat(loan_number,'|')" />
            <xsl:value-of select="concat(loan_aqn_date,'|')" />
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

Upvotes: 1

Related Questions