使用XSLT2.0拆分大型xml文件
我有这个源xml文件使用XSLT2.0拆分大型xml文件,xml,xslt,split,xslt-2.0,saxon,Xml,Xslt,Split,Xslt 2.0,Saxon,我有这个源xml文件 <DATA> <DATASET> <KE action="create"> <A>USVa</A> <B>USVb</B> <C>USV10</C> </KE> <KE> ....
<DATA>
<DATASET>
<KE action="create">
<A>USVa</A>
<B>USVb</B>
<C>USV10</C>
</KE>
<KE>
....
</KE>
</DATASET>
</DATA>
美国退伍军人协会
USVb
USV10
....
“KE”元素大约存在30000次。我想每5000“KE”创建一个新的XML文件。对于30000个KE元素,结果必须是6个单独的xml文件,结构必须是源xml的副本
如何使用XSLT2.0实现这一点?我用的是萨克森9-5-1-3j。非常感谢…使用XSLT2.0功能
xsl:for each group
和KE
元素的位置模数。然后,使用xsl:result-document
元素生成输出文档
我的示例XSLT代码为3个KE
元素组创建了一个新的结果文档。将输入XML的数字调整为“5000”
样式表
1由于@Martin Honnen,简化了样式表2再次编辑,建议@michael.hor257k
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/DATA">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="DATASET">
<xsl:for-each-group select="KE" group-starting-with="KE[(position() -1)mod 3 = 0]">
<xsl:variable name="file" select="concat('ke',position(),'.xml')"/>
<xsl:result-document href="{$file}">
<DATA>
<DATASET>
<xsl:copy-of select="current-group()"/>
</DATASET>
</DATA>
</xsl:result-document>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
输出:ke2.xml
<?xml version="1.0" encoding="UTF-8"?>
<DATA>
<DATASET>
<KE n="1" action="create">
<A>USVa</A>
<B>USVb</B>
<C>USV10</C>
</KE>
<KE n="2" action="create">
<A>USVa</A>
<B>USVb</B>
<C>USV10</C>
</KE>
<KE n="3" action="create">
<A>USVa</A>
<B>USVb</B>
<C>USV10</C>
</KE>
</DATASET>
</DATA>
<?xml version="1.0" encoding="UTF-8"?>
<DATA>
<DATASET>
<KE n="4" action="create">
<A>USVa</A>
<B>USVb</B>
<C>USV10</C>
</KE>
<KE n="5" action="create">
<A>USVa</A>
<B>USVb</B>
<C>USV10</C>
</KE>
<KE n="6" action="create">
<A>USVa</A>
<B>USVb</B>
<C>USV10</C>
</KE>
</DATASET>
</DATA>
美国退伍军人协会
USVb
USV10
美国退伍军人协会
USVb
USV10
美国退伍军人协会
USVb
USV10
其他输出文档看起来都一样。不客气。请注意,模数为3时,第一组只有2个元素。因此,对于5000个元素,第一组只有4999个元素。我认为你应该用
替换。@MartinHonnen:是的,这是一个很好的改进。我将编辑我的帖子。你应该使用(position()-1)mod 3
。这将消除第一组异常。谢谢@MathiasMüller,有没有办法避免对祖先节点(数据、数据集)进行硬编码在样式表中?对于这种规模,XSLT 2.0应该可以,但如果您谈论的是300000或3000000次,那么您最好使用更多的流式方法,例如基于StAX的方法(因为您提到了Saxon,我想您是在Java中工作)。