2013-03-01 2 views
1

내가XSLT 계수는

내가 HTML 열 병합에 번역이 비슷한을 시도
<BOXHEAD> 
    <COLHEAD H="1">Item</COLHEAD> 
    <COLHEAD H="2">Cost</COLHEAD> 
    <COLHEAD H="3">Direct</COLHEAD> 
    <COLHEAD H="3">In-Direct</COLHEAD> 
    <COLHEAD H="2">Revenue</COLHEAD> 
    <COLHEAD H="3">1989</COLHEAD> 
    <COLHEAD H="3">1990</COLHEAD> 
</BOXHEAD> 

과 유사한 XML이 요소 내에서 속성 열은 colspan="2"으로 나오지만 물론 count()은 블록의 @H="3" 네 개를 모두 집니다. 나는 그 고대 SGML을 HTML 테이블로 바꾸려고 노력하고있다. 아웃 원하는 넣어이 유사합니다

<table> 
<tbody> 
<tr> 
    <td colspan="1" rowspan="2">Item</td> 
    <td colspan="2" rowspan="1">Cost</td> 
    <td colspan="2" rowspan="1">Revenue</td> 
</tr> 
<tr> 
    <td>Direct</td> 
    <td>In-Direct</td> 
    <td>1989</td> 
    <td>1990</td> 
</tr> 
</tbody> 
</table> 

는 ROWSPAN 계산 및 열 병합 나를 위해 어려운 것으로 증명된다.

+0

해당 샘플 입력에 대해 원하는 출력 XML을 게시 할 수 있습니까? –

+0

요구 사항 .. 내가 이해하지만 조용하지 않다. .. 이해할 수있는 것은 다음과 같은 형제를 사용하고 있기 때문에' Cost' 를 만나면'2 '를 반환합니다. 수익' –

+1

반환 할 것으로 예상되는 것은 ** 연속 된'COLHEAD' 요소의 수입니다 (속성 H = "3") 현재 노드를 따라가 .. 그게 바로 ?? –

답변

3

당신이 누구 가까운 이전-형제 @H=2 우리가 현재보고있는 한 모든 COLHEAD[@H=3] 요소를 선택이

<xsl:variable name="descendants" 
    select="following-sibling::COLHEAD[@H = 3] 
     [generate-id((preceding-sibling::COLHEAD[@H=2])[last()]) 
     = generate-id(current())]"/> 

같은 트릭을 사용할 수 있습니다.

+0

+1 정확한 해결책. –

+0

와우. 나는 그것을 시도 할 것이다. 지금 당장은 여전히 ​​그것을 이해하려고 노력하고 있습니다. – Paulb

+0

@Paulb'generate-id'는 매우 유용한 함수입니다. 두 표현식이 _same 노드를 선택하는지 여부를 확인할 수 있습니다 (동일한 문자열 값을 가진 노드와 반대 됨). 제가 여기서하고있는 일은 : 각'@ H = 3' COLHEAD에 대해 모든 선행 형제 인'@H = 2' 요소를 찾고, 문서 순서에서 가장 최근에있는 요소 중 하나를 선택하고, 그것들이 같은지 확인하십시오 우리가 시작한'@H = 2' 노드 ('()'외부에서 컨텍스트 노드를 얻기 위해'current() '사용) –

2

XSLT 2.0에있는 경우 여기에 위치 그룹화 (예 : <xsl:for-each-group group-starting-with="[@H='2']>)를 사용해야합니다. 그러나 원하는 출력을 정확하게 모르는 상태에서 세부 정보를 제공하기는 어렵습니다.

+0

어제의 답변은 몇 가지 유스 케이스에서 작동했고 그 다음에는 떨어져 나갔다. 그래서 각 그룹에 대해 XSLT 2.0을 살펴볼 것입니다. 나는 원하는 출력을 추가하여 원래의 질문을 명확히했습니다. 고맙습니다. – Paulb