6

I am having trouble reading out my nested for-each loops. For some reason, it doesn't loop under the direct nodes. The trouble seems to be with the tages.My first loop happens after I open the table, and I loop through the whole table for the admin reports and nest the second node underneath it. This works fine, but when I go to nest additional nodes underneath, I am able to pull the values, but not specific to the parent node. My eyes are pretty much bloodshot from this exercise, could someone lend some help. Thanks in advance.

XSL:

    <tr bgcolor="9acd32">
    <table><th>Data Source Name:</th></table>
    <table><th><xsl:value-of select="@Value"/>   </th></table>
    </tr>
    <tr> 
   <xsl:for-each select="*[name()='PartInformation']">  
       <table bgcolor="#99ff66"><th>Part Information:</th></table>
       <table bgcolor="#99ff66"><th><xsl:value-of select="@Value"/></th></table>       
   <tr> 
    <xsl:for-each select="*/*[name()='InspPrgInformation']">    
       <table bgcolor="#33ccff"><th>Inspection Program ID:</th></table>
       <table bgcolor="#33ccff"><th><xsl:value-of select="@Value"/></th></table>
    <table bgcolor="#33ccff"><th><xsl:value-of select="@NoOfTracefields"/></th></table>
    </xsl:for-each>
    </tr>
    </xsl:for-each>
    </tr>         
<tr> 
   <xsl:for-each select="*/*/*[name()='AreaInformation']">    
       <table bgcolor="#FFFF99"><th>Area Information:</th></table>
       <table bgcolor="#FFFF99"><th><xsl:value-of select="@Area"/></th></table>
       <table bgcolor="#FFFF99"><th><xsl:value-ofselect="@AreaCount"/>         
  </th></table>
   </xsl:for-each>
   </tr>

 </xsl:for-each>
</table>
</center>

XML:

 <AdminReports xmlns="30/11/2011 09:25:58">

  <AdminReport ID="1">
    <DataSourceInformation DataSourceID="2" Value="DCS_AERO_KINSTON_DCS350">
      <PartInformation PartID="8" Value="WithAreaInfo">
        <InspPrgInformation InspPrgID="10" Value="DCS350_Sec15Drill_Pannel1WithInfo"       NoOfTracefields="1">          
          <AreaInformation Area="L3" AreaCount="59"/>
          <AreaInformation Area="L4" AreaCount="45"/>
          <AreaInformation Area="LT4" AreaCount="54"/>
        </InspPrgInformation>
      </PartInformation>
      <PartInformation PartID="9" Value="NoAreaInfo">
        <InspPrgInformation InspPrgID="9" Value="DCS350_Sec15Trim_Pannel1" NoOfTracefields="0"/>
      </PartInformation>
    </DataSourceInformation>
  </AdminReport>

  <AdminReport ID="2">
    <DataSourceInformation DataSourceID="2" Value="DCS_AERO_KINSTON_DCS350">
      <PartInformation PartID="8" Value="NoAreaInfo">
        <InspPrgInformation InspPrgID="10" Value="WithInfo" NoOfTracefields="1">          

        </InspPrgInformation>
      </PartInformation>
      <PartInformation PartID="9" Value="AreaInfo">
        <InspPrgInformation InspPrgID="9" Value="DCS350_Sec15Trim_Pannel1" NoOfTracefields="0">
          <AreaInformation Area="L4" AreaCount="75"/>
          <AreaInformation Area="LT4" AreaCount="4"/>
        </InspPrgInformation>
      </PartInformation>
    </DataSourceInformation>
  </AdminReport>
</AdminReports>

1 Answer 1

8

What you are doing is wrong for what you want to achieve:

<xsl:for-each select="*[name()='PartInformation']">  
   <table bgcolor="#99ff66"><th>Part Information:</th></table>
   <table bgcolor="#99ff66"><th><xsl:value-of select="@Value"/></th></table>       
   <tr> 
   <xsl:for-each select="*/*[name()='InspPrgInformation']">    
       <table bgcolor="#33ccff"><th>Inspection Program ID:</th></table>
       <table bgcolor="#33ccff"><th><xsl:value-of select="@Value"/></th></table>
    <table bgcolor="#33ccff"><th><xsl:value-of select="@NoOfTracefields"/></th></table>
    </xsl:for-each>
    </tr>
</xsl:for-each>

The second for each is by no means related with the first one. Same goes with your third for-each.

Do not the the current() will give you the currently iterated node.

You could rewrite your first two for-each like this :

<tr>
            <xsl:for-each select="*[name()='PartInformation']">
                <tr>
                    <xsl:for-each select="current()/*/InspPrgInformation">
                        <table bgcolor="#33ccff">
                            <th>Inspection Program ID:</th>
                        </table>
                        <table bgcolor="#33ccff">
                            <th>
                                <xsl:value-of select="@Value"/>
                            </th>
                        </table>
                        <table bgcolor="#33ccff">
                            <th>
                                <xsl:value-of select="@NoOfTracefields"/>
                            </th>
                        </table>
                    </xsl:for-each>
                </tr>
            </xsl:for-each>
        </tr>

The third one can be used with your current design. Because current() is local to each for-each, so your third for-each has no idea about the other two. In addition your design seems to be using xslt as a programming language which is not the way to go.

Finally try to provide some complete/compilable examples next time as well as your target document.

Sign up to request clarification or add additional context in comments.

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.