基于位置

时间:2017-05-11 14:04:51

标签: xml xslt xslt-1.0 xalan

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

修改-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个节点创建批次一样?

1 个答案:

答案 0 :(得分:2)

警告:我不认为这是一个很好的解决方案。但是,如果您无法返回并修改变量的创建方式(或完全取消变量并直接在原始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() &lt; $batchSize]" />
            </batch>
        </xsl:for-each>
    </root>
</xsl:template>

</xsl:stylesheet>