XSLT1.0。。基于动态参数的图元分组

XSLT1.0。。基于动态参数的图元分组,xslt,Xslt,我尝试在XSLT1.0中进行分组 <Sheets> <Sheet> <ROI>5350</ROI> <TPI>830</TPI> </Sheet> <Sheet> <ROI>5459</ROI> <TPI>830</TPI> </Sheet>

我尝试在XSLT1.0中进行分组

<Sheets>
    <Sheet>
        <ROI>5350</ROI>
        <TPI>830</TPI>
    </Sheet>
    <Sheet>
        <ROI>5459</ROI>
        <TPI>830</TPI>
    </Sheet>
    <Sheet>
        <ROI>5350</ROI>
        <TPI>856</TPI>
    </Sheet>
    <Sheet>
        <ROI>5678</ROI>
        <TPI>856</TPI>
    </Sheet>
    <Sheet>
        <ROI>17473</ROI>
        <TPI>856</TPI>
    </Sheet>
    <Sheet>
        <ROI>5350</ROI>
        <TPI>857</TPI>
    </Sheet>
    <Sheet>
        <ROI>5713</ROI>
        <TPI>857</TPI>
    </Sheet>
</Sheets>

5350
830
5459
830
5350
856
5678
856
17473
856
5350
857
5713
857
在我的xslt中,我想传递一个动态值,比如数字4。。。我希望我的xml将4个表元素分组到一个集合中,如

<Sheets>
    <set>
    <Sheet>
        <ROI>5350</ROI>
        <TPI>830</TPI>
    </Sheet>
    <Sheet>
        <ROI>5459</ROI>
        <TPI>830</TPI>
    </Sheet>
    <Sheet>
        <ROI>5350</ROI>
        <TPI>856</TPI>
    </Sheet>
    <Sheet>
        <ROI>5678</ROI>
        <TPI>856</TPI>
    </Sheet>
    </set>
    <set>
    <Sheet>
        <ROI>17473</ROI>
        <TPI>856</TPI>
    </Sheet>
    <Sheet>
        <ROI>5350</ROI>
        <TPI>857</TPI>
    </Sheet>
    <Sheet>
        <ROI>5713</ROI>
        <TPI>857</TPI>
    </Sheet>
    </set>
</Sheets>

5350
830
5459
830
5350
856
5678
856
17473
856
5350
857
5713
857
比如,把4张纸分成一组,另外4张分成一组,最后把其余的纸分成一组

我在group param中提供group元素

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0">
    <xsl:output method="xml"/>
    <xsl:param name="group" select="4"/>
    <xsl:template match="/">
        <xsl:variable name="num_of_loos" select="ceiling(count(//Sheet) div number($group))"/>
        <root>
            <xsl:call-template name="loop">
                <xsl:with-param name="i">1</xsl:with-param>
            </xsl:call-template>
        </root>
    </xsl:template>
    <xsl:template name="loop">
        <xsl:param name="i"/>
        <xsl:if test="$i &lt;= count(//Sheet)">
            <set>
                <xsl:for-each select="//Sheet[position() &gt;= $i and position() &lt; ($i + $group)]">
                    <xsl:copy-of select="."/>
                </xsl:for-each>
            </set>
            <xsl:call-template name="loop">
                <xsl:with-param name="i" select="$i + $group"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

1.
这是输出

    <?xml version="1.0" encoding="UTF-8"?>

<root xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <set>
        <Sheet>
            <ROI>5350</ROI>
            <TPI>830</TPI>
        </Sheet>
        <Sheet>
            <ROI>5459</ROI>
            <TPI>830</TPI>
        </Sheet>
        <Sheet>
            <ROI>5350</ROI>
            <TPI>856</TPI>
        </Sheet>
        <Sheet>
            <ROI>5678</ROI>
            <TPI>856</TPI>
        </Sheet>
    </set>
    <set>
        <Sheet>
            <ROI>17473</ROI>
            <TPI>856</TPI>
        </Sheet>
        <Sheet>
            <ROI>5350</ROI>
            <TPI>857</TPI>
        </Sheet>
        <Sheet>
            <ROI>5713</ROI>
            <TPI>857</TPI>
        </Sheet>
    </set>
</root>

5350
830
5459
830
5350
856
5678
856
17473
856
5350
857
5713
857

当您想将元素排列成一组特定的数字时,一种方法是首先选择每个集合中的第一个元素

<xsl:for-each select="Sheet[position() mod $num = 1]">

然后,您可以像这样选择集合中的元素(即,选择当前元素,以及根据所需数量选择其后面的元素)


试试这个XSLT

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

   <xsl:param name="num" select="'4'" />

   <xsl:template match="@*|node()">
     <xsl:copy>
       <xsl:apply-templates select="@*|node()"/>
     </xsl:copy>
   </xsl:template>

   <xsl:template match="/Sheets">
     <xsl:copy>
       <xsl:for-each select="Sheet[position() mod $num = 1]">
          <Set>
             <xsl:apply-templates select="self::*|following-sibling::Sheet[position() &lt; $num]" />
          </Set>
       </xsl:for-each>
     </xsl:copy>
   </xsl:template>
</xsl:stylesheet>


请注意,使用复制始终保持不变的元素。

请将完整输出显示给我好吗?我无法显示上述内容。。基本上,我想把床单分组到数字中,我们传递动态银行Daniel,是的,这正是我想要的。我现在也更新了山谷
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes" />

   <xsl:param name="num" select="'4'" />

   <xsl:template match="@*|node()">
     <xsl:copy>
       <xsl:apply-templates select="@*|node()"/>
     </xsl:copy>
   </xsl:template>

   <xsl:template match="/Sheets">
     <xsl:copy>
       <xsl:for-each select="Sheet[position() mod $num = 1]">
          <Set>
             <xsl:apply-templates select="self::*|following-sibling::Sheet[position() &lt; $num]" />
          </Set>
       </xsl:for-each>
     </xsl:copy>
   </xsl:template>
</xsl:stylesheet>