XSLT 2.0 - 如何通过选择X个节点

时间:2017-12-12 06:01:57

标签: xml xslt

我正在尝试使用包含40,000多个节点的XML文档,并将文档分成10,000个或更少节点的段。

例如,项目节点重复40,000次以上的XML:

<catalog>
  <item>
    <partno>
    </partno>
  </item>
</catalog>

我正在尝试完成此结构,在每个第10,000项中创建一个新段,直到文档完成。

<segment>
  <Item></Item>(10,000 max)
</segment>
<segment>
  <Item></Item>(10,000 max)
</segment>

我确信我可以用模数来做到这一点,但我想知道是否有更优雅的方式。

2 个答案:

答案 0 :(得分:3)

您可以在 XSLT 2.0

中尝试此操作
<xsl:template match="catalog">
    <xsl:for-each-group select="item" group-by="(position() - 1) idiv 10000">
        <segment>
            <xsl:copy-of select="current-group()"/>
        </segment>
    </xsl:for-each-group>
</xsl:template>

答案 1 :(得分:2)

我建议不要使用for-each-group group-by我建议使用group-adjacent,如果您转到XSLT 3,您可以轻松使用流式传输而无需更改分组代码(您只需要设置模式作为<xsl:mode streamable="yes"/>):

<xsl:template match="catalog">
  <xsl:for-each-group select="item" group-adjacent="(position() - 1) idiv 10000">
    <xsl:result-document href="split{position()}.xml">
       <segment>
         <xsl:copy-of select="current-group()"/>
       </segment>
   </xsl:result-document>
  </xsl:for-each-group>
</xsl:template>