XSLT 1.0 ..基于动态参数的组元素

时间:2014-11-24 17:49:36

标签: xslt

我在xslt 1.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>

在我的xslt中,我想传递一个动态值,说4号...我希望我的xml分组到4个Sheet元素到一组像

<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>

喜欢,将4张纸分组到一组,其他4到1组,最后剩下的一套到一组

2 个答案:

答案 0 :(得分:0)

你在这里

我在小组参数中提供了组元素

<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>

这是输出

    <?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>

答案 1 :(得分:0)

如果要将元素排列成特定数字的集合,那么接近它的一种方法是首先选择每个集合中第一个元素

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

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

<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>

试试这个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>

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