2010-10-24 57 views
3

我發現這個問題在這裏一個優雅的解決方案:xsl for-each: add code block every n rows?xslt - 每加n節點加</tr><tr>?

我想了解XSLT代碼,我想知道你能不能幫我考慮看看上面提供的鏈接去了解它。基本上有3 <xsl:template>。對我來說,前兩個足以達到目的。不過,我只用了2 <xsl:template>,它不起作用。總之第三個是必需的。它是:

<xsl:template match="gallery[not(position() mod 6 = 1)]"/> 

第二個模板有一個模式,而最後一個沒有。

我不知道什麼時候執行最後一個。你能幫我弄清楚嗎?

感謝您的幫助。

問候,

羅蘭

+0

不要鏈接鏡像;) – 2010-10-24 21:14:39

+0

爲什麼你不要問Dimitre Novatchev在回答評論? – 2010-10-24 21:21:26

+0

好問題,+1。看到我的代碼的詳細解釋。 – 2010-10-24 21:33:53

回答

3

以下是您詢問的完整代碼。我碰巧是作者,所以讓我解釋一下:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

以下模板將覆蓋元素節點的XSLT內置模板。 它匹配每6k + 1個gallery元素。它會創建一個tr元素,並在其內部將其處理此元素的結果放置到下一個5。處理以特殊模式(「proc」)完成,以區別於默認的匿名模式,在模板中啓動並繼續運行。

<xsl:template match="gallery[position() mod 6 = 1]"> 
    <tr> 
    <xsl:apply-templates mode="proc" 
     select=".|following-sibling::gallery[not(position() > 5)]" 
    /> 
    </tr> 
</xsl:template> 

下面的模板被調用在模式「PROC」到一組6個在每gallery元素應該是相同的行中的處理。

<xsl:template match="gallery" mode="proc"> 
    <td> 
    <img src="{gallery-image-location}" alt="{gallery-image-alt}"/> 
    </td> 
</xsl:template> 

下面的模板覆蓋XSLT的默認處理內置模板所有gallery元件,其位置是不是類型6K + 1(它們不開始一個新的6元組)的。它只是說不對任何這樣的元素做任何事情,因爲這些元素已經在「proc」模式下處理了。

<xsl:template match="gallery[not(position() mod 6 = 1)]"/> 
</xsl:stylesheet> 

您需要熟悉XSLT的處理模型,默認處理和內置模板。

+0

+1解釋。 – 2010-10-24 23:49:38

+0

@Dimitri:謝謝迪米特里,我現在明白了代碼是如何構建的:D – roland 2010-10-25 07:34:46

+0

@Alejandro:我不知道它實際上是一面鏡子:p我現在對自己感到羞恥;)說實話,我不知道該怎麼去爲了得到我的問題的答案:在這裏張貼,聯繫迪米特里自己,在最初的迪米特里的評論的末尾發表評論,...對不起,如果我污染了這個論壇,但這個解釋在我的愚見中值得一個新的話題; ) – roland 2010-10-25 07:35:48

1

第一模板相匹配的位置1和7中,第二模板被稱爲從第一模板內,以輸出所有兄弟姐妹。最後一個模板匹配位置2,3,4,5,6,8和9,以便再次注意到這些位置..就像一個無所事事的模板。