2011-03-04 54 views
1

如何修改下面的xsl,以便在放置圖像的for-each循環中每個表格行放置2個圖像,而不是4個(它目前的功能)。針對每個循環和格式化表格行的XSLT

我相信它與mod功能有關?

我試圖將foreach兄弟循環分割到另一行,但只有第一個圖像顯示在第一行,其餘的顯示在第二行。

<xsl:for-each select="Finding"> 
    <xsl:if test="FindingType = 'A'"> 
    <xsl:variable name="nImage" select="count(Image)" /> 
    <tr><td class="di"><table width="100%" class="findings"> 
    <tr><td class="shade" colspan="4"><p class="g"><b>Finding</b></p></td></tr> 
    <xsl:for-each select="Image[position() mod 4 = 1]"> 
<tr><td width="25%" align="left" valign="top"><p class="g"><img src="{.}" height="128" width="128" hspace="12"/><br /> 
    <xsl:value-of select="@Type" /><xsl:text> </xsl:text> <xsl:value-of select="@SubType" /> 
    <xsl:if test="@Position != ''"> (<xsl:value-of select="@Position" />)   </xsl:if><br /><br /> 
</p> 
    </td></tr> 
<tr><xsl:for-each select=". | following-sibling::Image[position() &lt; 4 and (position() mod 4 = 0 or position() mod 4 = 1 or position() mod 4 = 2)]"> 
    <td width="25%" valign="top" align="left"><p class="g"> 
    <xsl:if test="(string-length(following-sibling::Image/.) > 0)"> 
    <img src="{following-sibling::Image/.}" height="128" width="128" hspace="12" /> 
    </xsl:if> 
    <br /> 
     <xsl:value-of select="following-sibling::Image/@Type" />  <xsl:text> </xsl:text>  
    <xsl:value-of select="following-sibling::Image/@SubType" /> 
     <xsl:if test="following-sibling::Image/@Position != ''"> (<xsl:value-of select="following-sibling::Image/@Position" />)   </xsl:if> 
<br /><br /></p> 
</td> 
</xsl:for-each> 
    <xsl:if test="$nImage = 2"> 
    <td width="25%" /> 
    </xsl:if> 
</tr> 
+0

這個問題是沒有辦法對待你的朋友... – 2011-03-04 20:32:49

+0

好問題,+1。查看我的答案,獲取完整的解決方案並解釋必要的代碼重構。 – 2011-03-05 00:32:16

+0

@Alejandro::) :) – 2011-03-05 00:33:21

回答

1

是的,你應該改變Image[position() mod 4 = 1]使用2,而不是4 及以下. | following-sibling::Image[position() < 4 and (position() mod 4 = 0 or position() mod 4 = 1 or position() mod 4 = 2)]變得. | following-sibling::Image[position() < 2 and (position() mod 2 = 0)]

這應該夠了。

+2

那麼,你可能會想要將25%的幾個實例更改爲50%;當你詛咒那些以這種不靈活的方式編寫代碼的人時,你的繼任者應該通過對列數使用變量來推廣它,而不是對它進行硬編碼。 – 2011-03-04 21:16:38

+0

@邁克爾凱:沒錯。 'with-sibling ::'軸的表達式將變爲'。 | following-sibling :: Image [position()<$ numberOfImagesPerTableRow - 1]',如果我計算正確。 – 2011-03-04 21:36:02

+0

@阿列克謝伊萬諾夫:最後一個謂詞中的'和'是不必要的 - 請參閱我的答案。 – 2011-03-05 00:34:51

7

答案很簡單:由2更換4,甚至更好,定義一個全局,參數pNumCols與價值2

您將有以下變化:

  1. 在全球範圍添加此行<xsl:param name="pNumCols" select="2"/>

  2. 更換

    <xsl:for-each select="Image[position() mod 4 = 1]">

<xsl:for-each select="Image[position() mod $pNumCols = 1]">

0.3。 更換

<xsl:for-each select=". | following-sibling::Image 
       [position() &lt; 4 
      and (position() mod 4 = 0 or position() mod 4 = 1 
       or position() mod 4 = 2)]"> 

有:

<xsl:for-each select=". | following-sibling::Image 
           [not(position() >= $pNumCols)]"> 

請注意

<xsl:for-each select=". | following-sibling::Image 
       [position() &lt; 4 
      and (position() mod 4 = 0 or position() mod 4 = 1 
       or position() mod 4 = 2)]"> 

相當於短:

<xsl:for-each select=". | following-sibling::Image[position() &lt; 4 ]"> 
+1

+1。這個問題比這個問題更值得回答。 – Flack 2011-03-05 08:48:07

+0

+1我同意@Flack。 – 2011-03-05 12:44:04

+0

這個問題有什麼問題?無論如何,我確實嘗試了將4改爲2.但是這並不奏效。還有什麼我需要改變? – 2011-03-07 17:30:53