6

I am new to XSLT and have a problem that requires me to access the values from elements in a outer loop of a nested for-each within the inner loop. My XML looks as follows

<searchresults>
    <journeygroup>
        <journeygroupnum>1</journeygroupnum>
        <journeydetails>
            <flightsegments>1</flightsegments>
            <journeyid>1</journeyid>
            <currency>USD</currency>
            <fare>399.00</fare>
            <taxes>99.00</taxes>
            <flights>
                <segmentid>1</segmentid>
                <legid>1</legid>
                <marketingcarrier>DL</marketingcarrier>
                <operatingcarrier>DL</operatingcarrier>
                <flightnum>9695</flightnum> 
            </flights>
        </journeydetails>
        <journeydetails>
            <flightsegments>1</flightsegments>
            <journeyid>2</journeyid>
            <currency>USD</currency>
            <fare>459.00</fare>
            <taxes>129.00</taxes>
            <flights>
                <segmentid>1</segmentid>
                <legid>1</legid>
                <marketingcarrier>AA</marketingcarrier>
                <operatingcarrier>AA</operatingcarrier>
                <flightnum>5070</flightnum> 
            </flights>
        </journeydetails>
    </journeygroup>
</searchresults>

An extract of my XSLT document looks as follows

<table>
<xsl:for-each select="searchresults/journeygroup/journeydetails">       
    <xsl:for-each select="flights[segmentid='1']">
    <tr>
        <td><xsl:value-of select="marketingcarrier"/></td>
        <td><xsl:value-of select="operatingcarrier"/></td>
        <td><xsl:value-of select="flightnum"/></td>

        <!-- Here I would like to add columns with the currency and fare from the outer loop -->
        <td>currency</td>
        <td>fare</td>
    </tr>
    </xsl:for-each>
</xsl:for-each>
<table>

How do I access values from the currency and fare nodes in the outer loop from the inner for-each loop.

1

3 Answers 3

11

You can access the parent relatively:

<xsl:value-of select="../currency"/>

Or capture the outside loop current node with a variable and then access it inside:

<table>
  <xsl:for-each select="searchresults/journeygroup/journeydetails">
    <xsl:variable name="journeyDetails" select="."/>
    <xsl:for-each select="flights[segmentid='1']">
      <tr>
        <td><xsl:value-of select="marketingcarrier"/></td>
        <td><xsl:value-of select="operatingcarrier"/></td>
        <td><xsl:value-of select="flightnum"/></td>

        <!-- Here I would like to add columns with the 
             currency and fare from the outer loop -->
        <td><xsl:value-of select="$journeyDetails/currency"/></td>
        <td><xsl:value-of select="$journeyDetails/fare"/></td>
      </tr>
    </xsl:for-each>
  </xsl:for-each>
</table>
Sign up to request clarification or add additional context in comments.

2 Comments

Thank you both suggestions worked. Is either of these options better than the other one?
Relative path is more parsimonious and fine for this simple case. Defining a separate variable can be easier to follow when named well and when the context is less clear in more complicated cases.
3

Use the parent axis, aka the .. operator.

<table>
<xsl:for-each select="searchresults/journeygroup/journeydetails">       
<xsl:for-each select="flights[segmentid='1']">
<tr>
    <td><xsl:value-of select="marketingcarrier"/></td>
    <td><xsl:value-of select="operatingcarrier"/></td>
    <td><xsl:value-of select="flightnum"/></td>

    <!-- Here I would like to add columns with the currency and fare from the outer loop -->
    <td><xsl:value-of select="../currency"/></td>
    <td><xsl:value-of select="../fare"/></td>
</tr>
</xsl:for-each>
</xsl:for-each>
<table>

Comments

1

Navigate up using <xsl:value-of select="../currency"/>.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.