xslt中基于位置的批处理节点
batch nodes in xslt based on positions
我在 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 兼容的解决方案。我查看了下面 link 甚至无法解决我的问题:
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 个节点创建批处理一样?
警告:我认为这不是一个好的解决方案。但是,如果您无法返回并修改变量的创建方式(或完全消除它并直接在原始 row
节点上工作),那么这应该适合您:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="batchSize" select="2"/>
<xsl:template match="/">
<!-- simulation of generating the variable from the input -->
<xsl:variable name="var">
<node>1</node>
<node>2</node>
<node>3</node>
<node>4</node>
<node>5</node>
</xsl:variable>
<!-- output -->
<root>
<xsl:for-each select="exsl:node-set($var)/node[position() mod $batchSize = 1]">
<batch number="{position()}">
<xsl:copy-of select=". | following-sibling::node[position() < $batchSize]" />
</batch>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>
我在 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 兼容的解决方案。我查看了下面 link 甚至无法解决我的问题: 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 个节点创建批处理一样?
警告:我认为这不是一个好的解决方案。但是,如果您无法返回并修改变量的创建方式(或完全消除它并直接在原始 row
节点上工作),那么这应该适合您:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="batchSize" select="2"/>
<xsl:template match="/">
<!-- simulation of generating the variable from the input -->
<xsl:variable name="var">
<node>1</node>
<node>2</node>
<node>3</node>
<node>4</node>
<node>5</node>
</xsl:variable>
<!-- output -->
<root>
<xsl:for-each select="exsl:node-set($var)/node[position() mod $batchSize = 1]">
<batch number="{position()}">
<xsl:copy-of select=". | following-sibling::node[position() < $batchSize]" />
</batch>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>