2014-11-01 44 views
0

我在以下XSLT代碼中遇到問題。XSLT:帶有嵌套IF子句的foreach,如何獲得「第一個TRUE結果」?

Foreach循環產生14個記錄,並且將它們的4通過

<xsl:if test="esperto = 'F'">

子句選擇。

<xsl:for-each select="../partite/risultatopartita"> 
    <xsl:if test="esperto = 'F'"> 
    <tr> 
     <xsl:if test="position()=1"> 
     <td rowspan="4" class='centra'>Favorite</td> 
     </xsl:if> 
     <td class='centra'>        
     <xsl:value-of select="posizione"/> 
     </td> 
     <td class='centra'>        
     <xsl:value-of select="squadra1"/> 
     </td> 
     <td class='centra'>        
     <xsl:value-of select="squadra2"/> 
     </td> 
    </tr> 
    </xsl:if> 
</xsl:for-each> 

我需要第一TD(一用rowspan="4")將被印刷的僅第一次,但「第一次,如果子句爲真,不先的foreach迭代」。

Infact,<xsl:if test="position()=1">得到第一次foreach迭代,但顯然可能的是,滿足<xsl:if test="esperto = 'F'">的迭代不可能是第一個foreach。

如何解決?


期望中的HMTL代碼:

<table> 
    <tr> 
     <td rowspan="4" class='centra'>Favorite</td> 
     <td class="centra">2</td> 
     <td class="centra">fooText 1</td> 
     <td class="centra">foofooText 1</td> 
    </tr> 
    <tr> 
     <td class="centra">6</td> 
     <td class="centra">fooText 2</td> 
     <td class="centra">foofooText 2</td> 
    </tr> 
    <tr> 
     <td class="centra">10</td> 
     <td class="centra">fooText 3</td> 
     <td class="centra">foofooText 3</td> 
    </tr> 
    <tr> 
     <td class="centra">14</td> 
     <td class="centra">fooText 4</td> 
     <td class="centra">foofooText 4</td> 
    </tr> 
</table> 
+0

你能告訴我們輸入XML和預期的輸出XML嗎? – 2014-11-01 15:19:17

+0

對不起...我沒有這個...但我添加了所需的html輸出 – 2014-11-01 15:25:52

+0

我對你爲什麼使用rowspan = 4感到困惑。你提前知道總會有4行? – JLRishe 2014-11-01 15:55:56

回答

1

代替

<xsl:for-each select="../partite/risultatopartita"> 
    <xsl:if test="esperto = 'F'"> 

你應該簡單地把一個謂語在選擇表達,即使用

<xsl:for-each select="../partite/risultatopartita[esperto = 'F']"> 

應該這樣做,至少只要您的真實代碼除了xsl:for-each內部的xsl:if之外什麼也沒有。

+0

謝謝Martin,我也嘗試了Lingamurthy的解決方案,它運行正確,所以與您的解決方案一樣有效,但最終我決定接受您的解決方案,因爲它更緊湊。 :-) – 2014-11-03 08:53:30

1

這是很艱難的找到沒有輸入XML的答案。 您可以使用下面的代碼你的,每個塊代替:

<xsl:for-each select="../partite/risultatopartita"> 
<xsl:if test="esperto = 'F'"> 
    <tr> 
     <xsl:if test="not(preceding-sibling::risultatopartita/esperto='F')"> 
      <td rowspan="4" class='centra'>Favorite</td> 
     </xsl:if> 
     <td class='centra'>        
      <xsl:value-of select="posizione"/> 
     </td> 
     <td class='centra'>        
      <xsl:value-of select="squadra1"/> 
     </td> 
     <td class='centra'>        
      <xsl:value-of select="squadra2"/> 
     </td> 
    </tr> 
</xsl:if> 
</xsl:for-each> 
+0

謝謝你,Lingamurthy,你是第一個提出解決方案,我試着你的解決方案運行正確,所以我絕對可以說這是一個有效的解決方案。但是我第二次嘗試了Martin的答案,它更加緊湊。無論如何,謝謝你的幫助。 – 2014-11-03 08:56:09