2013-07-30 2 views
0

나는 XSL 작업을 시작하고 독특한 동적 열 데이터에 문제가있다. 비슷한 문제에 대해 읽었지만 이러한 상황이이 문제에 대한 해결책을 적용하지 못하는 것 같습니다.XSL 동적 테이블 열 데이터는

I 성장 또는 <ID><Date> 값의 많은 수의 축소 할 수 있습니다 다음 샘플 데이터 세트가 있습니다

<Report> 
    <DataSets> 
    <Data> 
     <ID>1</ID> 
     <Date>201211</Date> 
    </Data> 
    <Data> 
     <ID>1</ID> 
     <Date>201211</Date> 
    </Data> 
    <Data> 
     <ID>1</ID> 
     <Date>201210</Date> 
    </Data> 
    <Data> 
     <ID>2</ID> 
     <Date>201209</Date> 
    </Data> 
    <Data> 
     <ID>1</ID> 
     <Date>201208</Date> 
    </Data> 
    <Data> 
     <ID>2</ID> 
     <Date>201208</Date> 
    </Data> 
    <Data> 
     <ID>3</ID> 
     <Date>201208</Date> 
    </Data> 
    <Data> 
     <ID>3</ID> 
     <Date>201208</Date> 
    </Data> 
    </DataSets> 
</Report> 

나는 다음과 같은 테이블을 생성하는 XSL 코드를 얻기 위해 노력하고 있어요 :

ID 201208 201209 201210 201211 
1  1  0  1  2 
2  1  1  0  0 
3  2  0  0  0 

열은 동적이며 열 헤더는 <Date> 요소의 고유 값이다. 행은 데이터의 카운트 인 가진 고유 ID의 집합 각각에 대해 <Date><ID>을 말한다. 내가 고민하고 각 <Date>에 대한 <ID>의 수의 동적 생성합니다.

나는 테이블을 생성 키를 사용하여 지금까지 다음 XSL 파일을 가지고 있지만, 당신이 볼 수있는 날짜는 하드 기압을 코딩하고 있습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       version="1.0" > 

<xsl:template match ="/" > 
<html> 
    <body> 
    <xsl:apply-templates select="Report/DataSets"/> 
    </body> 
</html> 
</xsl:template> 

<xsl:key name="Data_ID" match="Data" use="ID" /> 
<xsl:key name="Data_D" match="Data" use="Date"/> 
<xsl:template match="Report/DataSets" > 
<table> 
    <tr> 
    <th>ID</th> 
    <xsl:for-each select="Data[generate-id(.) = generate-id(key('Data_D', Date)[1])]"> 
     <xsl:sort select="Date"/> 
     <!-- Dynamically add headers for each Date Column --> 
     <th><xsl:value-of select="Date"/></th> 
    </xsl:for-each> 
    </tr> 
    <xsl:for-each select="Data[generate-id(.) = generate-id(key('Data_ID', ID)[1])]"> 
    <xsl:sort select="ID"/> 
    <tr> 
    <td><xsl:value-of select="ID"/></td> 
    <!-- Dynamically count IDs for each Date Column --> 
    <!-- How to do this step? --> 
    <td><xsl:value-of select="count(key('Data_ID', ID)[Date='201208'])"/></td> 
    <td><xsl:value-of select="count(key('Data_ID', ID)[Date='201209'])"/></td> 
    <td><xsl:value-of select="count(key('Data_ID', ID)[Date='201210'])"/></td> 
    <td><xsl:value-of select="count(key('Data_ID', ID)[Date='201211'])"/></td> 
    </tr> 
    </xsl:for-each> 
</table> 
</xsl:template> 
</xsl:stylesheet> 

이 하드 코딩 항목

동적 코드와
<td><xsl:value-of select="count(key('Data_ID', ID)[Date='201208'])"/></td> 
<td><xsl:value-of select="count(key('Data_ID', ID)[Date='201209'])"/></td> 
<td><xsl:value-of select="count(key('Data_ID', ID)[Date='201210'])"/></td> 
<td><xsl:value-of select="count(key('Data_ID', ID)[Date='201211'])"/></td> 

대체 무엇을 필요합니까?

답변

0

당신은 당신이 헤더

<!-- store the full set of Data in a variable - we will need it inside the for-eaches --> 
    <xsl:variable name="allData" select="Data"/> 
    <xsl:for-each select="$allData[generate-id(.) = generate-id(key('Data_ID', ID)[1])]"> 
    <xsl:sort select="ID"/> 
    <xsl:variable name="currentId" select="ID" /> 
    <tr> 
    <td><xsl:value-of select="$currentId"/></td> 
    <!-- Dynamically count IDs for each Date Column --> 
    <xsl:for-each select="$allData[generate-id(.) = generate-id(key('Data_D', Date)[1])]"> 
     <xsl:sort select="Date"/> 
     <td> 
     <xsl:value-of select="count(key('Data_ID', $currentId)[Date=current()/Date])"/> 
     </td> 
    </xsl:for-each> 
    </tr> 
    </xsl:for-each> 

여기에 트릭을 사용하면 내부에있는 동안 당신이 그것을 액세스 할 수 있도록 변수에 외부 for-each에서 ID을 저장하는 것입니다 사용 for-each의 같은 종류를 사용할 수 있습니다 내부 for-each.

의 가능성이보다 효율적인 대안

<xsl:key name="Data_ID_D" match="Data" use="concat(ID, '|', Date)" /> 

count 표현을 단순화 할 ID와 날짜 모두에서 세 번째 키를 정의하는 것입니다

<xsl:for-each select="$allData[generate-id(.) = generate-id(key('Data_D', Date)[1])]"> 
    <xsl:sort select="Date"/> 
    <td> 
    <xsl:value-of select="count(key('Data_ID_D', concat($currentId, '|', Date)))"/> 
    </td> 
</xsl:for-each> 
+0

이 방법은 작동하지 않는 것, I 빈 테이블을 얻으십시오. 추가'에 대한-each'의 문제는 상황이 이미 설정되어 있고 당신이 날짜에 대한 새 컬렉션을 만들 경로까지 다시 이동할 수 나타나지 않는다는 것입니다. 또한 두 개의 키를 결합하려는 시도는 작동하지 않습니다. 왜냐하면 키가 자체적으로 고유해야하고 고유하지 않은 행 항목에서 결과가 결합되어야하기 때문입니다. – JMO

+0

@ JMO 좋은 지적. Muellerian 트릭을 for for each와 같은 기본 노드 집합 (편집 참조)에서 수행 할 수 있도록 외부 변수를 다른 변수에 저장해야합니다. –

+0

아, 그래, 그랬어. 완벽하게 작동합니다. 감사합니다. – JMO