XSLT For-Each 包装 div 中的每第 n 个项目 [英] XSLT For-Each Wrapping every nth item in a div

查看:24
本文介绍了XSLT For-Each 包装 div 中的每第 n 个项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一系列节点,它们是父节点的直接子节点我想遍历这些节点,但将它们包裹在 4 个组"中......我可能没有说清楚,所以这可能会有所帮助;

@nodename<span class="child02">@nodename</span><span class="child03">@nodename</span><span class="child04">@nodename</span><span class="child05">@nodename</span><span class="child06">@nodename</span><span class="child07">@nodename</span><span class="child08">@nodename</span>..<span class="child32">@nodename</span><span class="child33">@nodename</span>..等等

目标

<span class="child01">@nodename</span><span class="child02">@nodename</span><span class="child03">@nodename</span><span class="child04">@nodename</span>

<div class="group"><span class="child05">@nodename</span><span class="child06">@nodename</span><span class="child07">@nodename</span><span class="child08">@nodename</span>

<div class="group">..<span class="child32">@nodename</span>

<div class="group"><span class="child33">@nodename</span>..等等

我尝试了这个想法的变体 - 将批次包装在打开和关闭组标签中,每四个循环放入一个新的关闭/打开对

<xsl:for-each select="$currentPage/*"><跨度><xsl:value-of select="@nodeName"/></span><!--==============================================================在第四项之后==============================================================--><xsl:if test="position() mod 4 = 0"><xsl:text></div><div class="page"></xsl:text></xsl:if></xsl:for-each>

但本质上似乎 XSLT 不会让我从一个不匹配的结束标签开始到目前为止,我发现的 clkoset 解决方案是 jquery Wrapping a div 中的修复"大约每三个 div 但我宁愿不依赖 javascript 来格式化页面.

解决方案

这种转变:

<xsl:output omit-xml-declaration="yes" indent="yes"/><xsl:strip-space elements="*"/><xsl:param name="pNumCols" select="3"/><xsl:template match="/*"><xsl:apply-templates select="span[position() mod $pNumCols = 1]"/></xsl:模板><xsl:template match="span"><div><xsl:copy-of select=".|following-sibling::span[not(position() > $pNumCols -1)]"/>

</xsl:模板></xsl:stylesheet>

应用于提供的 XML 文档时:

<span class="child01">@nodename</span><span class="child02">@nodename</span><span class="child03">@nodename</span><span class="child04">@nodename</span><span class="child05">@nodename</span><span class="child06">@nodename</span><span class="child07">@nodename</span><span class="child08">@nodename</span>..<span class="child32">@nodename</span><span class="child33">@nodename</span></t>

产生想要的结果:

<span class="child01">@nodename</span><span class="child02">@nodename</span><span class="child03">@nodename</span>

<div><span class="child04">@nodename</span><span class="child05">@nodename</span><span class="child06">@nodename</span>

<div><span class="child07">@nodename</span><span class="child08">@nodename</span><span class="child32">@nodename</span>

<div><span class="child33">@nodename</span>

I have a series of nodes that are direct child nodes to a parent I want to loop over those nodes but have them wrapped in 'groups' of 4... I'm probably not wording this very clearly so this might help;

<span class="child01">@nodename</span>
<span class="child02">@nodename</span>
<span class="child03">@nodename</span>
<span class="child04">@nodename</span>
<span class="child05">@nodename</span>
<span class="child06">@nodename</span>
<span class="child07">@nodename</span>
<span class="child08">@nodename</span>
..
<span class="child32">@nodename</span>
<span class="child33">@nodename</span>
..and so on

Goal

<div class="group">
<span class="child01">@nodename</span>
<span class="child02">@nodename</span>
<span class="child03">@nodename</span>
<span class="child04">@nodename</span>
</div>
<div class="group">
<span class="child05">@nodename</span>
<span class="child06">@nodename</span>
<span class="child07">@nodename</span>
<span class="child08">@nodename</span>
</div>
<div class="group">
..
<span class="child32">@nodename</span>
</div>
<div class="group">
<span class="child33">@nodename</span>
..and so on

I have tried variations on this idea - wrapping the lot in the open and closing group tags and every fourth loop drop in a new close / open pair

<div class="group">
<xsl:for-each select="$currentPage/*">

<span>
<xsl:value-of select="@nodeName" />
</span>

 <!--
            =============================================================
            After very 4th item  
            =============================================================
            -->
            <xsl:if test="position() mod 4 = 0">
              <xsl:text></div><div class="page"></xsl:text>
            </xsl:if>

        </xsl:for-each>
</div>

But essentially it seems XSLT won't let me start with a closing unmatched tag The clkoset solution I ahve found so far is a 'fix' in jquery Wrapping a div around every three divs but I would rather not rely on javascript to format the page.

解决方案

This transformation:

<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:param name="pNumCols" select="3"/>

 <xsl:template match="/*">
  <xsl:apply-templates select="span[position() mod $pNumCols = 1]"/>
 </xsl:template>

 <xsl:template match="span">
  <div>
   <xsl:copy-of select=
    ".|following-sibling::span[not(position() > $pNumCols -1)]"/>
  </div>
 </xsl:template>
</xsl:stylesheet>

when applied on the provided XML document:

<t>
    <span class="child01">@nodename</span>
    <span class="child02">@nodename</span>
    <span class="child03">@nodename</span>
    <span class="child04">@nodename</span>
    <span class="child05">@nodename</span>
    <span class="child06">@nodename</span>
    <span class="child07">@nodename</span>
    <span class="child08">@nodename</span> .. 
    <span class="child32">@nodename</span>
    <span class="child33">@nodename</span>
</t>

produces the wanted result:

<div>
   <span class="child01">@nodename</span>
   <span class="child02">@nodename</span>
   <span class="child03">@nodename</span>
</div>
<div>
   <span class="child04">@nodename</span>
   <span class="child05">@nodename</span>
   <span class="child06">@nodename</span>
</div>
<div>
   <span class="child07">@nodename</span>
   <span class="child08">@nodename</span>
   <span class="child32">@nodename</span>
</div>
<div>
   <span class="child33">@nodename</span>
</div>

这篇关于XSLT For-Each 包装 div 中的每第 n 个项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
其他开发最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆