【发布时间】:2017-05-11 14:04:51
【问题描述】:
我在 xslt 中有一个变量,其节点如下:
<xsl:variable name='var'>
<node>1</node>
<node>2</node>
<node>3</node>
<node>4</node>
</xsl:variable>
我想以变量<xsl:variable name='batchSize' select='2'/> 中存在的最大批量大小对它们进行批处理。现在我正在做的是:
<xsl:for-each-group group-by='position() idiv $batchSize' select="$var">
<xsl:variable name="batch">
<xsl:for-each select="."> <!-- hoping to select each element in a group; also tried select="current-group()" instead of select="." -->
<xsl:copy-of select="."/>
</xsl:for-each>
<xsl:variable name="batchSet" select="xalan:node-set($batch)"/>
</xsl:for-each-group>
但上面的代码不起作用。这有什么问题?请纠正。对 xslt 1.0 和 2.0 解决方案开放。
编辑: 正如@michael.hor257k 所指出的,xalan 不支持 XSLT 2.0,这解释了为什么 current-group() 不起作用,从而使我的方法完全无用。请提供与 xalan 兼容的解决方案。我查看了以下链接,即使这样也无法解决我的问题: grouping based on position.
EDIT-2: 节点生成为:
<xsl:variable name="var">
<xsl:for-each select="row"> <!-- row I am obtaining from somewhere else -->
<node><xsl:value-of select="position()"/></node>
</xsl:for-each>
</xsl:variable>
EDIT-3 我可以修改节点的创建方式。如果可能的话,您可以在那里提出更改建议。就像在每个第 N 个节点创建批次一样?
【问题讨论】:
-
我认为你想使用
select="$var/node"至少是有意义的,我不确定你想在for-each-group内做什么,因为只存储组以输出它不' t似乎取得任何成就。所以请显示/解释你想要的那个变量的结果,我相信我们可以修复它。 -
虽然您说您会接受 XSLT 1.0 解决方案,但我认为没有。在 XSLT 1.0 中,变量
$var的值,正如您定义的那样,是一个结果树片段。此类对象不支持您尝试应用的那种操作。 -
特别是,如果您必须以这种方式进行,首先要做的是确保您的样式表声明它使用 XSLT 2.0 版。
-
@JohnBollinger XSLT 1.0 是图灵完备的。
-
@helix 如果您使用的是 Xalan,那么您不会接受 XSLT 2.0 解决方案。事实上,你的尝试是两者的不可能混合。