我在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组,最后剩下的一套到一组
答案 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 <= count(//Sheet)">
<set>
<xsl:for-each select="//Sheet[position() >= $i and position() < ($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() < $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() < $num]" />
</Set>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
请注意使用XSLT identity template复制始终保持不变的元素。