保留一段静态的XSLT拆分

问题描述:

我想将下面的文件拆分为每个3个项目,并保持最后一节相同。此外,我还需要在每个拆分开始时出现的Header块(除了最后一个)。保留一段静态的XSLT拆分

输入文件

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<Root> 
<List> 
     <Header> 
       <test1>a</test1> 
     </Header> 
     <Item> 
      <ItemNumber> 
       <Number>1</Number> 
      </ItemNumber> 
     </Item> 
     <Item> 
      <ItemNumber> 
       <Number>2</Number> 
      </ItemNumber> 
     </Item> 
     <Item> 
      <ItemNumber> 
       <Number>3</Number> 
      </ItemNumber> 
     </Item> 
     <Item> 
      <ItemNumber> 
       <Number>4</Number> 
      </ItemNumber> 
     </Item> 
     <Item> 
      <ItemNumber> 
       <Number>5</Number> 
      </ItemNumber> 
     </Item> 
</List> 
<List> 
    <EOF MaxMsgPerFile="3" > 
    </EOF> 
</List> 
</Root> 

这是我曾尝试

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 


    <xsl:variable name="tag"> 
    <xsl:value-of select="/*/*/EOF/@MaxMsgPerFile"/> 
</xsl:variable> 

<xsl:template match="/Root"> 
<xsl:copy> 


    <xsl:for-each select="List[not (EOF)]/Item[position() mod $tag = 1]"> 
     <List> 
     <xsl:copy-of select="Header"/> 
     <xsl:copy-of select=". | following-sibling::Item[position() &lt; $tag]"/> 
     </List> 
    </xsl:for-each> 

    <xsl:copy-of select="List[EOF]"/> 
</xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

我得到我想要的一切,但我不能看到出现在各集拆分

这里是预期

<?xml version="1.0" encoding="UTF-8"?> 
<Root> 
<List> 
     <Header> 
       <test1>a</test1> 
     </Header> 
     <Item> 
      <ItemNumber> 
       <Number>1</Number> 
      </ItemNumber> 
     </Item> 
     <Item> 
      <ItemNumber> 
       <Number>2</Number> 
      </ItemNumber> 
     </Item> 
     <Item> 
      <ItemNumber> 
       <Number>3</Number> 
      </ItemNumber> 
     </Item> 
</List> 
<List> 
      <Header> 
       <test1>a</test1> 
     </Header> 
     <Item> 
      <ItemNumber> 
       <Number>4</Number> 
      </ItemNumber> 
     </Item> 
     <Item> 
      <ItemNumber> 
       <Number>5</Number> 
      </ItemNumber> 
     </Item> 
</List> 
<List> 
    <EOF MaxMsgPerFile="3"> 
    </EOF> 
</List> 
</Root> 

任何帮助是极大的赞赏

感谢

如何:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/Root"> 
    <xsl:variable name="groupSize" select="List/EOF/@MaxMsgPerFile" /> 
    <xsl:copy> 
     <xsl:for-each select="List/Item[position() mod $groupSize = 1]"> 
      <List> 
       <xsl:copy-of select="../Header | . | following-sibling::Item[position() &lt; $groupSize]"/> 
      </List> 
     </xsl:for-each> 
     <xsl:copy-of select="List[EOF]"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
+0

完美! - 这工作..谢谢@ michael.hor257k –