2011-12-08 30 views
6

Tengo problemas para leer mis bucles anidados para cada uno. Por alguna razón, no pasa por debajo de los nodos directos. El problema parece ser con los tages. Mi primer ciclo ocurre después de abrir la tabla, y recorro toda la tabla para los informes administrativos y anilo el segundo nodo debajo de él. Esto funciona bien, pero cuando voy a anidar nodos adicionales debajo, puedo extraer los valores, pero no específicos para el nodo padre. Mis ojos están casi inyectados en sangre por este ejercicio, podría alguien prestar algo de ayuda. Gracias por adelantado.XSL XML anidado para cada bucle

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> 

Respuesta

7

Lo que está haciendo es incorrecto para lo que quiere lograr:

<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> 

Los s econd para cada uno de ninguna manera está relacionado con el primero. Lo mismo ocurre con su tercera para cada uno.

No el current() le dará el nodo iterado actualmente.

Se podría volver a escribir su primera de dos por cada uno de la siguiente manera:

<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> 

El tercero se puede utilizar con su diseño actual. Porque current() es local para cada uno, por lo que su tercero para cada uno no tiene idea acerca de los otros dos. Además, su diseño parece estar utilizando xslt como lenguaje de programación, que no es el camino a seguir.

Finalmente intente proporcionar algunos ejemplos completos/compilables la próxima vez, así como su documento de destino.