2017-02-05 5 views
1

첫 번째 열의 내용에 대해 그룹화 테이블 행을 수행 한 다음 그룹의 각 행에 일정량의 처리를 수행해야합니다. 첫 번째 열의 내용 - 숫자. 열에 임의의 자릿수가 포함되어 있지 않으면 for-each-group에 접근합니다.XSLT-2.0 : 노드 내용별로 그룹화

예 입력 : 열의 번호 1

  • :

    <table> 
     
        <tr><td>1</td></tr> 
     
        <tr><td>2</td></tr> 
     
        <tr><td>1</td></tr> 
     
        <tr><td>1,2,3</td></tr> 
     
        <tr><td>1,4</td></tr> 
     
    </table>

    태스크에 따르면, I는 4 개 개의 그룹을 가져야 1,3,4을 , 5 행;

  • 2 열 4 열의 숫자 2;
  • 3 번 : 4th;
  • 4 : 5th.

일반적인 템플릿은 다음과 같습니다

<xsl:template match="table"> 
 
    <xsl:for-each-group select="tr" group-by="td[1]"> 
 
    <xsl:for-each select="current-group()"> 
 
    <!-- transformation --> 
 
    </xsl:for-each> 
 
    </xsl:for-each-group> 
 
</xsl:template>

그래서 group-by = "td [1]" 것을 작동하지 않습니다.
정규식이있는 키 ... 어렵습니다.

답변

2

마치 <xsl:for-each-group select="tr" group-by="td[1]"><xsl:for-each-group select="tr" group-by="tokenize(td[1], ',')">으로 바꾸고 싶은 것처럼 들립니다.

0

난 당신이

  1. 입력로서 당신은 행과 열이있는 테이블을 가지고 말을 생각합니다.
  2. 각 행의 첫 번째 열에는 쉼표로 구분 된 숫자 목록이 들어 있습니다. 행에는 추가 열이 포함될 수 있지만 예제에는 표시되지 않습니다.
  3. 출력으로 쉼표로 분리 된 숫자 목록 집합의 각 고유 숫자 값에 대해 하나의 그룹을 만들려고합니다. 첫 번째 열의 쉼표로 구분 된 숫자 값을 포함하는 행으로 구성됩니다.

첫 번째 열의 쉼표로 분리 된 목록의 각 숫자에 대해 행이 한 번씩 또는 해당 목록의 각 고유 값에 대해 한 번씩 나타납니다 (명확하지 않음).

내가

<xsl:for-each-group select="tr" 
    group-by="tokenize(td[1],',')"> 
    <xsl:message>Now processing <xsl:value-of 
     select="count(current-group()"/>rows containing <xsl:value-of 
     select="current-grouping-key()"/> in column 1.</ 
    ... 
</ 

이 (테스트되지 않음.) 시도 것

0

을 사용하면 출력에 각 그룹의 값을 포함하는 원래의 행 번호를 원하는 경우에, 나는 당신에 입력을 변환 할 필요가 있다고 생각 원래 position()을 포함하는 또 다른 데이터 구조. 다음과 같은 내용 :

<xsl:template match="table"> 
    <xsl:variable name="row-data"> 
     <xsl:for-each select="tr/td"> 
      <xsl:variable name="row" select="position()" /> 
      <xsl:for-each select="tokenize(., ',')"> 
       <data> 
       <xsl:attribute name="row" select="$row" /> 
       <xsl:attribute name="value" select="." /> 
       </data> 
      </xsl:for-each> 
     </xsl:for-each> 
    </xsl:variable> 

    <data> 
     <xsl:for-each-group select="$row-data/*" group-by="@value"> 
     <group> 
      <xsl:attribute name="value" select="@value" /> 
      <xsl:value-of select="current-group()/@row" separator=","/> 
     </group> 
     </xsl:for-each-group> 
    </data> 
</xsl:template>