2014-07-02 41 views
1

Xml文件带有始终存在的某些元素。这是一个例子。XSLT:如果元素文本不同于上一个,则按记录数和拆分文件拆分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并且当前的味道是Orange,那么分割文件。但是如果最后一个PieFlavor是Cherry并且当前PieFlavor是樱桃,那么继续并将文件分割成每一定数量的记录。

我把记录拆分了下来,然后当我学会了我必须以另一种方式拆分文件时卡住了。

<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> 

回答

2

尝试拼图2个分组:

<xsl:for-each-group select="//record" group-adjacent="PieFlavor"> <xsl:for-each-group select="current-group()" group-adjacent="(position() - 1) idiv $recordNum">

+0

这似乎是在抱怨写多个文件到同一个URI。我将结果文档放在嵌套的分组中,当我调试它时,它似乎被当前组的内部循环捕获() – Oron

+0

我将定义一个'',然后使用该变量作为文件名的一部分,以确保获得结果文档的唯一文件名。 –

+0

啊谢谢你,完美的作品,谢谢。我认为它必须以某种方式使用另一个变量。 – Oron