xsl for-each:每n行添加一个代码块? [英] xsl for-each: add code block every n rows?

查看:150
本文介绍了xsl for-each:每n行添加一个代码块?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图将表示图像库的xml转换成html表格。 (它必须用HTML而不是用CSS来完成)。 如何使用xsl添加行间隔< / tr>< tr>< / code>每六列左右



我有这个:

 < xsl:for-each select =// email / gallery> 
< td>
< img>
< xsl:attribute name =src>
< xsl:value-of select =gallery-image-location/>
< / xsl:attribute>
< xsl:attribute name =alt>
< xsl:value-of select =gallery-image-alt/>
< / xsl:attribute>
< / img>
< / td>
< xsl:if test =????>
< / tr>
< tr>
< / xsl:if>
< xsl:for-each>

在Javascript中,我会做类似于:

  for(i = 0; i< gallery.length; i ++){
htm + ='< td>< img src ='+
gallery [i] .gallery-image-location +
'alt ='+ gallery [i] .gallery-image-alt +'>< / td>';

if(i%6 == 5& i!= gallery.length-1){
htm + ='< / tr>< tr>'



$ div $解析方案

$















$ b $ >在XSLT中,您不需要!



XSLT处理节点,而不是标记。 b $ b

以下是位置分组的XSLT方式:

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

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

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

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

在以下XML文档中应用此转换时:

 < email> 
< gallery>
< gallery-image-location> http:// server / picts / 1< / gallery-image-location>
< gallery-image-alt>描述1< / gallery-image-alt>
< / gallery>
< gallery>
< gallery-image-location> http:// server / picts / 2< / gallery-image-location>
< gallery-image-alt>描述2< / gallery-image-alt>
< / gallery>
< gallery>
< gallery-image-location> http:// server / picts / 3< / gallery-image-location>
< gallery-image-alt>描述3< / gallery-image-alt>
< / gallery>
< gallery>
< gallery-image-location> http:// server / picts / 41< / gallery-image-location>
< gallery-image-alt>描述4< / gallery-image-alt>
< / gallery>
< gallery>
< gallery-image-location> http:// server / picts / 5< / gallery-image-location>
< gallery-image-alt>描述5< / gallery-image-alt>
< / gallery>
< gallery>
< gallery-image-location> http:// server / picts / 6< / gallery-image-location>
< gallery-image-alt>描述6< / gallery-image-alt>
< / gallery>
< gallery>
< gallery-image-location> http:// server / picts / 7< / gallery-image-location>
< gallery-image-alt>描述7< / gallery-image-alt>
< / gallery>
< gallery>
< gallery-image-location> http:// server / picts / 8< / gallery-image-location>
< gallery-image-alt>描述8< / gallery-image-alt>
< / gallery>
< gallery>
< gallery-image-location> http:// server / picts / 9< / gallery-image-location>
< gallery-image-alt>描述9< / gallery-image-alt>
< / gallery>
< / email>

想要的,正确的结果是


$ b

 < tr> 
< td>
< img src =http:// server / picts / 1alt =说明1/>
< / td>
< td>
< img src =http:// server / picts / 2alt =说明2/>
< / td>
< td>
< img src =http:// server / picts / 3alt =说明3/>
< / td>
< td>
< img src =http:// server / picts / 41alt =说明4/>
< / td>
< td>
< img src =http:// server / picts / 5alt =说明5/>
< / td>
< td>
< img src =http:// server / picts / 6alt =说明6/>
< / td>
< / tr>
< tr>
< td>
< img src =http:// server / picts / 7alt =说明7/>
< / td>
< td>
< img src =http:// server / picts / 8alt =说明8/>
< / td>
< td>
< img src =http:// server / picts / 9alt =说明9/>
< / td>
< / tr>


I am trying to transform a bit of xml which represents an image gallery into an html table. (it must be done with html and not with css). How do I add the row break </tr><tr> every six or so columns with xsl?

I have this:

<xsl:for-each select="//email/gallery" >
<td>
    <img>
    <xsl:attribute name="src">
        <xsl:value-of select="gallery-image-location"/>
    </xsl:attribute>
    <xsl:attribute name="alt">
        <xsl:value-of select="gallery-image-alt"/>
    </xsl:attribute>
    </img>
</td>
<xsl:if test="????">
    </tr>
    <tr>
</xsl:if>
<xsl:for-each>

In Javascript I would do something like:

for (i=0; i<gallery.length; i++) {
    htm += '<td><img src="' +
    gallery[i].gallery-image-location +
    '" alt="'+ gallery[i].gallery-image-alt +'"></td>';

    if (i%6 == 5 && i != gallery.length-1) {
        htm += '</tr><tr>';
    }
}

解决方案

How do I add the row break every six or so columns with xsl?

In XSLT you don't!

XSLT processes nodes, not tags.

Here is the XSLT way of positional grouping:

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

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

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

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

when this transformation is applied on the following XML document:

<email>
    <gallery>
        <gallery-image-location>http://server/picts/1</gallery-image-location>
        <gallery-image-alt>Description 1</gallery-image-alt>
    </gallery>
    <gallery>
        <gallery-image-location>http://server/picts/2</gallery-image-location>
        <gallery-image-alt>Description 2</gallery-image-alt>
    </gallery>
    <gallery>
        <gallery-image-location>http://server/picts/3</gallery-image-location>
        <gallery-image-alt>Description 3</gallery-image-alt>
    </gallery>
    <gallery>
        <gallery-image-location>http://server/picts/41</gallery-image-location>
        <gallery-image-alt>Description 4</gallery-image-alt>
    </gallery>
    <gallery>
        <gallery-image-location>http://server/picts/5</gallery-image-location>
        <gallery-image-alt>Description 5</gallery-image-alt>
    </gallery>
    <gallery>
        <gallery-image-location>http://server/picts/6</gallery-image-location>
        <gallery-image-alt>Description 6</gallery-image-alt>
    </gallery>
    <gallery>
        <gallery-image-location>http://server/picts/7</gallery-image-location>
        <gallery-image-alt>Description 7</gallery-image-alt>
    </gallery>
    <gallery>
        <gallery-image-location>http://server/picts/8</gallery-image-location>
        <gallery-image-alt>Description 8</gallery-image-alt>
    </gallery>
    <gallery>
        <gallery-image-location>http://server/picts/9</gallery-image-location>
        <gallery-image-alt>Description 9</gallery-image-alt>
    </gallery>
</email>

the wanted, correct result is produced:

<tr>
    <td>
        <img src="http://server/picts/1" alt="Description 1"/>
    </td>
    <td>
        <img src="http://server/picts/2" alt="Description 2"/>
    </td>
    <td>
        <img src="http://server/picts/3" alt="Description 3"/>
    </td>
    <td>
        <img src="http://server/picts/41" alt="Description 4"/>
    </td>
    <td>
        <img src="http://server/picts/5" alt="Description 5"/>
    </td>
    <td>
        <img src="http://server/picts/6" alt="Description 6"/>
    </td>
</tr>
<tr>
    <td>
        <img src="http://server/picts/7" alt="Description 7"/>
    </td>
    <td>
        <img src="http://server/picts/8" alt="Description 8"/>
    </td>
    <td>
        <img src="http://server/picts/9" alt="Description 9"/>
    </td>
</tr>

这篇关于xsl for-each:每n行添加一个代码块?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆