XSL 每次 sum 等于 12 时添加一个包装器 [英] XSL add a wrapper every time sum equals 12

查看:22
本文介绍了XSL 每次 sum 等于 12 时添加一个包装器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想转这个

<root>
  <item columns="4"></item>
  <item columns="8"></item>
  <item columns="12"></item>
  <item columns="4"></item>
  <item columns="4"></item>
  <item columns="4"></item>
  <item columns="2"></item>
  <item columns="10"></item>
</root>

进入这个

<root>
  <row>
    <item columns="4"></item>
    <item columns="8"></item>
  </row>
  <row>
    <item columns="12"></item>
  </row>
  <row>
    <item columns="4"></item>
    <item columns="4"></item>
    <item columns="4"></item>
  </row>
  <row>
    <item columns="2"></item>
    <item columns="10"></item>
  </row>
</root>

推荐答案

您可以通过以下方式查看:

Here's one way you could look at it:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/root">
    <xsl:copy>
        <xsl:call-template name="aggregate">
            <xsl:with-param name="items" select="item"/>
        </xsl:call-template>
    </xsl:copy>
</xsl:template>

<xsl:template name="aggregate">
    <xsl:param name="items" select="/.."/>
    <xsl:param name="i" select="1"/>
    <xsl:variable name="stack-items" select="$items[position() &lt;= $i]" />
    <xsl:choose>
        <xsl:when test="sum($stack-items/@columns) >= 12 or $i >= count($items)">
            <row>
                <xsl:copy-of select="$stack-items"/>
            </row>
            <xsl:if test="$i &lt; count($items)">
                <xsl:call-template name="aggregate">
                    <xsl:with-param name="items" select="$items[position() > $i]"/>
                </xsl:call-template>
            </xsl:if>
        </xsl:when>
        <xsl:otherwise>
            <xsl:call-template name="aggregate">
                <xsl:with-param name="items" select="$items"/>
                <xsl:with-param name="i" select="$i + 1"/>
            </xsl:call-template>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

</xsl:stylesheet>

<小时>

搜索兄弟递归以寻找替代方法.

这篇关于XSL 每次 sum 等于 12 时添加一个包装器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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