2016-09-02 2 views
0

XML 파일을 그룹으로 분할해야합니다. 각각을 특정 노드의 주어진 수로 제한.노드 수를 기준으로 XML 파일 분할

샘플 입력 데이터 : I 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> 

그러나,이 코드는 추가 데이터 노드를 설명하기 위해 수정하고 여전히 아래의 원하는 결과를 제공하는 세 개의 행의 그룹으로 분리 될 필요가 방법을 모르겠어요. 나는 모든 도움에 크게 감사한다!

그래서 원하는 결과는 다음과 같이한다 : 당신은 <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

관련 문제