xslt - 添加每个n节点?

时间:2010-10-24 20:26:08

标签: xml xslt

我在这里找到了一个优雅的解决方案:xsl for-each: add code block every n rows?

我想了解xslt代码,我想知道你是否可以通过查看上面提供的链接来帮助我理解它。

基本上有3 <xsl:template>。对我来说,前两个足以达到目的。但是我只尝试了2 <xsl:template>并且它不起作用。简而言之,第三个是必需的。这是:

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

第二个模板有一个模式,而最后一个模板没有。

我不知道最后一个执行的时间。你能帮我解决一下吗?

感谢您的帮助。

此致

罗兰

2 个答案:

答案 0 :(得分: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元素,并在其正文中将处理此gallery元素的结果与下一个元素放在一起。处理以特殊模式(“proc”)完成,以区别于默认值匿名模式,其中XSLT内置模板已启动并继续运行。

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

以下模板将覆盖所有gallery元素的XSLT内置模板的默认处理,这些元素的位置不是类型6k + 1(它们不是启动新的6元组)。它只是不对任何这样的元素做任何事情,因为这些元素已经在“proc”模式下处理。

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

您需要熟悉XSLT的处理模型,默认处理和内置模板。

答案 1 :(得分:1)

第一个模板匹配位置1和7,第二个模板从第一个模板中调用以输出所有兄弟姐妹。最后一个模板匹配位置2,3,4,5,6,8和9,以便再次注意到那些位置......就像一个无所事事的模板。