2017-12-12 4 views
1

私は40,000以上のノードを持つXML文書を取得し、10,000以下のノードのセグメントに文書を分割しようとしています。私は、ドキュメントが終了するまで、新たなセグメントがそれぞれ10,000項目で作成され、この構造を実現しようとしているXノード数を選択してそれぞれを使用して結果を作成する方法

<catalog> 
    <item> 
    <partno> 
    </partno> 
    </item> 
</catalog> 

:アイテムノードは40,000プラス回繰り返さ例えば、XMLの

<segment> 
    <Item></Item>(10,000 max) 
</segment> 
<segment> 
    <Item></Item>(10,000 max) 
</segment> 

私はモジュラスでこれを行うことができますが、もっとエレガントな方法があるのでしょうか?

答えて

3

あなたは(私はあなたがXSLT 3に移動する場合は、簡単にグループ化コードを変更せずにストリーミングを使用することができる方法としてgroup-adjacentを使用することをお勧めXSLT 2.0

<xsl:template match="catalog"> 
    <xsl:for-each-group select="item" group-by="(position() - 1) idiv 10000"> 
     <segment> 
      <xsl:copy-of select="current-group()"/> 
     </segment> 
    </xsl:for-each-group> 
</xsl:template> 
+0

ありがとうございます!これは完全に機能し、私が問題に近づく方法よりもはるかにエレガントです。 – ChrisLail

+0

@ChrisLail - その隣にあるチェックマークをクリックして回答を受け入れることを忘れないでください。 –

2

代わりのfor-each-group group-byを使用して、これを試すことができますモードを<xsl:mode streamable="yes"/>に設定するだけです):

<xsl:template match="catalog"> 
    <xsl:for-each-group select="item" group-adjacent="(position() - 1) idiv 10000"> 
    <xsl:result-document href="split{position()}.xml"> 
     <segment> 
     <xsl:copy-of select="current-group()"/> 
     </segment> 
    </xsl:result-document> 
    </xsl:for-each-group> 
</xsl:template> 
関連する問題