开发者

xslt - adding </tr><tr> every n node?

I found an elegant solution for that problem here: xsl for-each: add code block every n rows?

I'd like to understand the开发者_StackOverflow中文版 xslt code and I was wondering if you could help me to understand it by taking a look at the link provided above.

Basically there are 3 <xsl:template>. To me the first 2 ones are enough to achieve the purpose. However I tried with only 2 <xsl:template> and it doesn't work. In short the third one is required. Here it is:

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

The second template has a mode while the last one has not.

I have no idea when the last one is executed. Could you please help me to figure out it?

Thanks for your help.

Regards,

Roland


Here is the complete code you were asking about. I happen to be the author, so let me explain:

<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="*"/> 

The following template overrides the XSLT built-in template for element nodes. It matches every 6k+1th gallery element. It cretes a tr element and inside its body puts the results of processing this gallery element togeether with the next 5. The processing is done in a special mode ("proc") to distinguish this from the default anonymous mode in which the XSLT built-in templates started and continue to operate.

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

The following template is invoked in mode "proc" to process every gallery element in a group of 6 that should be in the same row.

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

The following template overrides the default processing of the XSLT built-in templates for all gallery elements, whose position is not of the type 6k+1 (they are not starting a new 6-tuple). It says simply not to do anything with any such element, because these elements are already processed in "proc" mode.

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

You need to acquaint yourself with XSLT's processing model, default processing and built-in templates.


The first template matches position 1 and 7, the second template is called from within the first template to output all the siblings. The last template matches position 2,3,4,5,6,8 and 9 so that noting happens to those positions again..like a do nothing-template.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜