我正在尝试使用包含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>
我确信我可以用模数来做到这一点,但我想知道是否有更优雅的方式。
答案 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>