XSLT:按记录数拆分xml文件,如果元素文本与上一个不同,则拆分文件
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>
<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()的内部循环中。我将在外部为每个分组定义一个
,然后将该变量用作文件名的一部分,以确保为结果文档获得唯一的文件名。啊,谢谢,这非常有效,非常感谢。我想这必须归结到使用另一个变量。