Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XSLT2.0拆分大型xml文件_Xml_Xslt_Split_Xslt 2.0_Saxon - Fatal编程技术网

使用XSLT2.0拆分大型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> ....

我有这个源xml文件

   <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中工作)。