Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.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
XSLT:按记录数拆分xml文件,如果元素文本与上一个不同,则拆分文件_Xml_File_Xslt_Split - Fatal编程技术网

XSLT:按记录数拆分xml文件,如果元素文本与上一个不同,则拆分文件

XSLT:按记录数拆分xml文件,如果元素文本与上一个不同,则拆分文件,xml,file,xslt,split,Xml,File,Xslt,Split,Xml文件中包含某些始终存在的元素。这就是一个例子 <xml> <record> <PieFlavor>Pie</PieFlavor> </record> <record> <PieFlavor>Cherry</PieFlavor> </record> <record> <PieFlavor&

Xml文件中包含某些始终存在的元素。这就是一个例子

<xml>
   <record>
        <PieFlavor>Pie</PieFlavor>
   </record>
   <record>
        <PieFlavor>Cherry</PieFlavor>
   </record>
    <record>
        <PieFlavor>Cherry</PieFlavor>
   </record>
   <record>
        <PieFlavor>Orange</PieFlavor>
   </record>
   <record>
        <PieFlavor>Orange</PieFlavor>
   </record>
   <record>
        <PieFlavor>Orange</PieFlavor>
  </record>
</xml>

馅饼
樱桃
樱桃
橙色
橙色
橙色
在这个xml文件中,元素xml、record和PieFlavor始终存在

我需要做的是,每隔一定数量的记录(比如每1000条记录分割一次文件)分割xml文件,然后每次PieFlavor中的文本与上一条发生变化时也分割该文件。因此,如果最后一个PieFlavor是Cherry,而当前的flavor是Orange,则分割文件。但是如果最后一个PieFlavor是Cherry,而当前的PieFlavor是Cherry,那么继续并每隔一定数量的记录拆分文件

我把记录拆分了,然后当我知道我必须用另一种方式拆分文件时,有点卡住了

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" version="1.0"
    encoding="UTF-8" indent="yes"/>
  <xsl:param name="recordNum" select="1000"/>
  <xsl:template match="xml">
    <xsl:for-each-group select=".//record"
      group-adjacent="(position()-1) idiv $recordNum">
      <xsl:result-document  href="file:///{WATCHTEMPFOLDER}{format-number(position(),'000000000')}.xml">
        <xml>
          <xsl:copy-of select="current-group()"/>
        </xml>
      </xsl:result-document>
    </xsl:for-each-group>
  </xsl:template>
</xsl:stylesheet>

我仍然在学习XSLT,所以我不确定在保持将recordNum轻松更改为更低或更高数字的能力的同时,应该采取什么样的最佳方法。我想用一个变量来跟踪元素文本并进行检查,或者使用前面的同级或其他东西,但不确定我将如何适应它

更新:

这是工作版本。再次感谢

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" version="1.0"
    encoding="UTF-8" indent="yes"/>
  <xsl:param name="recordNum" select="1000"/>
  <xsl:template match="xml">
    <xsl:for-each-group select=".//record" group-adjacent="PieFlavor">
      <xsl:variable name="flavor" select="concat(current-grouping-key(),position())"/>
      <xsl:for-each-group select="current-group()" group-adjacent="(position()-1) idiv $recordNum">
        <xsl:result-document  href="file:///{WATCHTEMPFOLDER}{$flavor}{format-number(position(),'000000000')}.xml">
            <xml>
              <xsl:copy-of select="current-group()"/>
            </xml>
          </xsl:result-document>
        </xsl:for-each-group>
    </xsl:for-each-group>
  </xsl:template>
</xsl:stylesheet>

尝试嵌套两个组:



它似乎在抱怨将多个文档写入同一URI。我将结果文档放在嵌套的分组中,在调试时,它似乎陷入了当前-group()的内部循环中。我将在外部为每个分组定义一个
,然后将该变量用作文件名的一部分,以确保为结果文档获得唯一的文件名。啊,谢谢,这非常有效,非常感谢。我想这必须归结到使用另一个变量。