Вложенный XML XSL для каждого цикла - PullRequest
6 голосов
/ 08 декабря 2011

У меня проблемы с чтением моих вложенных циклов for-each.По какой-то причине он не зацикливается под прямыми узлами.Проблема, похоже, заключается в tages. Мой первый цикл происходит после того, как я открываю таблицу, и я перебираю всю таблицу для отчетов администратора и вкладываю второй узел под ней.Это работает нормально, но когда я иду, чтобы вложить дополнительные узлы внизу, я могу получить значения, но не специфичные для родительского узла.Мои глаза в значительной степени налиты кровью от этого упражнения, может кто-нибудь помочь.Заранее спасибо.

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 Ответ

8 голосов
/ 08 декабря 2011

То, что вы делаете, это неправильно для того, чего вы хотите достичь:

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

Второе для каждого отнюдь не связано с первым. То же самое касается вашего третьего для каждого.

Не current() даст вам текущий итерированный узел.

Вы можете переписать свои первые два для каждого, как это:

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

Третий можно использовать с вашим текущим дизайном. Поскольку current() является локальным для каждого для каждого, поэтому ваш третий для каждого не имеет представления о двух других. Кроме того, кажется, что ваш дизайн использует xslt в качестве языка программирования, который не подходит.

Наконец, в следующий раз попробуйте предоставить несколько полных / скомпилированных примеров, а также целевой документ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...