2017-08-17 8 views
0

以下のファイルをそれぞれ3つのアイテムに分割し、最後のセクションも同じにしています。さらに、私はまた各分割(最後を除く)で最初に表示されるヘッダーブロックにする必要があります。ここでセクションを静的に維持する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> 

すべてのヘルプは大歓迎です

おかげ

答えて

0

方法について:

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 –

関連する問題