Я хочу равномерно распределить смежные значения в определенное количество групп, чтобы общая сумма каждой группы была больше 300, но меньше 390. Чтобы получить это, я понимаю, что значения нужно будет иногда разделять на Для достижения заданного количества групп.
Так что, если я начну с приведенного ниже, и я хочу только 5 с:
<root>
<entry>5</entry>
<entry>90</entry>
<entry>55</entry>
<entry>145</entry>
<entry>90</entry>
<entry>105</entry>
<entry>270</entry>
<entry>150</entry>
<entry>145</entry>
<entry>135</entry>
<entry>140</entry>
<entry>145</entry>
<entry>155</entry>
<entry>130</entry>
<entry>125</entry>
</root>`
Я хочу получить что-то вроде этого:
<root>
<group total="380">
<entry>5</entry>
<entry>90</entry>
<entry>55</entry>
<entry>145</entry>
<entry>90</entry>
</group>
<group total="375">
<entry>105</entry>
<entry>270</entry>
</group>
<group total="390">
<entry>150</entry>
<entry>145</entry>
<entry split='yes'>105</split>
</group>
<group total="390">
<entry split='yes'>30</entry>
<entry>140</entry>
<entry>145</entry>
<entry split='yes'>75</entry>
</group>
<group total="335">
<entry split='yes'>80</entry>
<entry>130</entry>
<entry>125</entry>
</group>
</root>
ближе всего я получил что-то вроде этого:
<xsl:variable name="total" select="sum(//entry)">
<xsl:variable name="set-number" select="xs:integer(ceiling($total div 390))"/>
<xsl:variable name="count" select="floor($total) div $set-number)"/>
<xsl:for-each-group select="entry" group-ending-with="*[(position() mod $count) = 0]">
<group total="{sum(current-group())}">
<xsl:apply-templates select="current-group()"/>
</group>
</xsl:for-each-group>
, что дает мне:
<root>
<group total="150">
<entry>5</entry>
<entry>90</entry>
<entry>55</entry>
</group>
<group total="340">
<entry>145</entry>
<entry>90</entry>
<entry>105</entry>
</group>
<group total="565">
<entry>270</entry>
<entry>150</entry>
<entry>145</entry>
</group>
<group total="420">
<entry>135</entry>
<entry>140</entry>
<entry>145</entry>
</group>
<group total="410">
<entry>155</entry>
<entry>130</entry>
<entry>125</entry>
</group>
</root>
, которое дает мне правильное количество групп, но не очень равномерное распределение.