2010-10-24 22 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,以便再次注意到这些位置..就像一个无所事事的模板。