xslt - adding every n node?

前端 未结 2 1018
粉色の甜心
粉色の甜心 2021-01-14 14:53

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

I\'d like to understand the xslt code and I was wondering if you could

相关标签:
2条回答
  • 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.

    0 讨论(0)
  • 2021-01-14 15:07

    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 讨论(0)
提交回复
热议问题