2016-09-02 8 views
0

XMLファイルをグループに分割する必要があります。各ノードを所定の数のノードに限定する。ノード数に基づいて分割XMLファイル

サンプルの入力データ:私は3のグループにファイルを分割するために取り組んで以下のXSLTを得ることができました

<RESULT> 
     <ROW> 
      <DATA>Item1</DATA>  
      <DATA1>SubItem1</DATA1>  
     </ROW> 
     <ROW> 
      <DATA>Item2</DATA>  
      <DATA1>SubItem1</DATA1>  
     </ROW> 
     <ROW> 
      <DATA>Item3</DATA>  
      <DATA1>SubItem3</DATA1>  
     </ROW> 
     <ROW> 
      <DATA>Item4</DATA>  
      <DATA1>SubItem4</DATA1>  
     </ROW> 
     <ROW> 
      <DATA>Item5</DATA>  
      <DATA1>SubItem5</DATA1>  
     </ROW> 
     <ROW> 
      <DATA>Item6</DATA>  
      <DATA1>SubItem6</DATA1>  
     </ROW> 
    </RESULT> 

はとき(:<ROW>Item1</ROW>たとえば)のみROWノードに存在するデータがあります。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" encoding="utf-8"/> 
    <xsl:param name="group-size" select="3"/> 
    <xsl:template match="/RESULT"> 
    <ROOT> 
     <xsl:if test="count(//ROW) > 0"> 
     <xsl:apply-templates select="ROW"/> 
     </xsl:if> 
    </ROOT> 
    </xsl:template> 
    <xsl:template match="ROW"> 
     <xsl:if test="position() mod $group-size = 1"> 
     <RESULT> 
      <xsl:apply-templates select=".|following-sibling::ROW[position() &lt; $group-size]" mode="list"/> 
     </RESULT> 
     </xsl:if> 
    </xsl:template> 
    <xsl:template match="ROW" mode="list"> 
     <ROW><xsl:value-of select="current()" /></ROW> 
    </xsl:template> 
</xsl:stylesheet> 

しかし、私はこのコードは、追加のデータノードを考慮して修正し、まだ下の望ましい結果を提供し、3行のグループに分割する必要があるかどうかはわかりません。私は何かすべての助けに非常に感謝します!

ので、望ましい結果は次のようになります。あなたは<xsl:apply-templates select="ROW[position() mod $group-size = 1]"/>を使用することができます

<RESULT> 
     <ROW> 
      <DATA>Item1</DATA>  
      <DATA1>SubItem1</DATA1>  
     </ROW> 
     <ROW> 
      <DATA>Item2</DATA>  
      <DATA1>SubItem1</DATA1>  
     </ROW> 
     <ROW> 
      <DATA>Item3</DATA>  
      <DATA1>SubItem3</DATA1>  
     </ROW> 
    </RESULT> 
    <RESULT> 
     <ROW> 
      <DATA>Item4</DATA>  
      <DATA1>SubItem4</DATA1>  
     </ROW> 
     <ROW> 
      <DATA>Item5</DATA>  
      <DATA1>SubItem5</DATA1>  
     </ROW> 
     <ROW> 
      <DATA>Item6</DATA>  
      <DATA1>SubItem6</DATA1>  
     </ROW> 
    </RESULT> 

答えて

1

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:output method="xml" indent="yes" encoding="utf-8"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:param name="group-size" select="3"/> 

    <xsl:template match="/RESULT"> 
     <ROOT> 
      <xsl:apply-templates select="ROW[position() mod $group-size = 1]"/> 
     </ROOT> 
    </xsl:template> 

    <xsl:template match="ROW"> 
     <RESULT> 
      <xsl:copy-of select=". | following-sibling::ROW[position() &lt; $group-size]"/> 
     </RESULT> 
    </xsl:template> 

</xsl:stylesheet> 
+0

これは私がそれをするために必要な正確にどのように働いていました。ありがとう! – brad999

関連する問題