2014-12-02 5 views
0

두 개의 열로 세로로 인덱스를 만들려면 각 열에 50 개의 행이 필요합니다. 2666.5 - 2665.3 ...........를Xslt 인덱스를 세로로 두 열 (50 행)

ACCIAROLI : 내 출력

<span style="font-family:Univers Condensed; font-size:9pt; "> 
    <xsl:for-each select="//VICINITY[not(. = preceding::VICINITY)]">    
     <xsl:sort select="." data-type="text" order="ascending"/> 
     <xsl:sort select="preceding-sibling::ITA_LIGHT_NUMBER" data-type="text" order="ascending"/> 
     <xsl:variable name ="localita" select="."/> 
     <xsl:value-of select="."/> 
     <xsl:text>....................</xsl:text> 
     <xsl:value-of select="preceding-sibling::ITA_LIGHT_NUMBER"/> 
      <xsl:for-each select="following::VICINITY[. = $localita][last()]"> 
       <xsl:text> - </xsl:text> 
       <xsl:value-of select="preceding-sibling::ITA_LIGHT_NUMBER"/> 
      </xsl:for-each> 
      <br/>   
    </xsl:for-each> 
</span> 

이다

는 I이 XSLT를 사용하여 (하나의 열로) 간단한 수직 인덱스를 작성
AMENDOLARA .......... 3431.25
ANCONA .............. 3921.9
브린 디시 ............ 3624
CASTELLAMMARE ....... 2573.5
CHIOGGIA ............ 4108
코 릴리 아노 CALABRO..3429.2 - 3429.55
FIUME TRIONTO ....... 3427
FRIGOLE ............. 3614.3
GENOVA ......... ..... 1577

하지만이 칼럼에서 분할 된 테이블의 수직 인덱스 것 :

<table> 
    <tr> 
    <td>ACCIAROLI.....2665.3 - 2666.5</td>  <td>CHIOGGIA............4108<br/></td> 
    </tr> 
    <tr>  
    <td>AMENDOLARA......3431.25</td>   <td>CORIGLIANO....3429.2-3429.55<br/></td> 
    </tr> 
    <tr> 
    <td>ANCONA............3921.9</td>   <td>FIUME TRIONTO.......3427<br/></td> 
    </tr> 
    <tr> 
    <td>BRINDISI...........3624</td>   <td>FRIGOLE.............3614.3<br/></td> 
    </tr> 
    <tr> 
    <td>CASTELLAMMARE.....2573.5</td>   <td>GENOVA..............1577<br/></td> 
    </tr> 
</table> 

이 (이 예를 들어 내가 다섯 행에 테이블을 감소)을 내 XML입니다 :

<SECTION_CONTENT_LIST_ITEM> 
    <NTC_LIGHTLISTPRODUCT>    
     <ITA_LIGHT_NUMBER>2665.3</ITA_LIGHT_NUMBER>    
     <VICINITY>ACCIAROLI</VICINITY> 
     <ITA_LIGHT_NAME>Secca Vecchia</ITA_LIGHT_NAME>    
    </NTC_LIGHTLISTPRODUCT> 
</SECTION_CONTENT_LIST_ITEM> 
<SECTION_CONTENT_LIST_ITEM> 
    <NTC_LIGHTLISTPRODUCT>    
     <ITA_LIGHT_NUMBER>2666.5</ITA_LIGHT_NUMBER> 
     <VICINITY>ACCIAROLI</VICINITY> 
     <ITA_LIGHT_NAME>Ondametro</ITA_LIGHT_NAME>    
     </NTC_LIGHTLISTPRODUCT> 
</SECTION_CONTENT_LIST_ITEM> 
<SECTION_CONTENT_LIST_ITEM> 
    <NTC_LIGHTLISTPRODUCT>    
     <ITA_LIGHT_NUMBER>3431.25</ITA_LIGHT_NUMBER> 
     <VICINITY>AMENDOLARA</VICINITY> 
     <ITA_LIGHT_NAME>Impianto di itticoltura;Boa "A"</ITA_LIGHT_NAME> 
    </NTC_LIGHTLISTPRODUCT> 
</SECTION_CONTENT_LIST_ITEM> 
<SECTION_CONTENT_LIST_ITEM> 
    <NTC_LIGHTLISTPRODUCT>    
     <ITA_LIGHT_NUMBER>3921.9</ITA_LIGHT_NUMBER>    
     <VICINITY>ANCONA</VICINITY> 
     <ITA_LIGHT_NAME>Installazioni per idrocarburi;BARBARA H</ITA_LIGHT_NAME>    
    </NTC_LIGHTLISTPRODUCT> 
</SECTION_CONTENT_LIST_ITEM> 
<SECTION_CONTENT_LIST_ITEM> 
    <NTC_LIGHTLISTPRODUCT>    
     <ITA_LIGHT_NUMBER>3624</ITA_LIGHT_NUMBER>    
     <VICINITY>BRINDISI</VICINITY> 
     <ITA_LIGHT_NAME>Brindisi-Casale (AERO)</ITA_LIGHT_NAME> 
    </NTC_LIGHTLISTPRODUCT> 
</SECTION_CONTENT_LIST_ITEM>   
<SECTION_CONTENT_LIST_ITEM> 
    <NTC_LIGHTLISTPRODUCT>    
     <ITA_LIGHT_NUMBER>2573.5</ITA_LIGHT_NUMBER> 
     <VICINITY>CASTELLAMMARE DI STABIA</VICINITY> 
     <ITA_LIGHT_NAME>Impianti di mitilicoltura;Boa SW</ITA_LIGHT_NAME>    
    </NTC_LIGHTLISTPRODUCT> 
</SECTION_CONTENT_LIST_ITEM> 
<SECTION_CONTENT_LIST_ITEM> 
    <NTC_LIGHTLISTPRODUCT> 
     <ITA_LIGHT_NUMBER>4108</ITA_LIGHT_NUMBER> 
     <VICINITY>CHIOGGIA</VICINITY> 
     <ITA_LIGHT_NAME>Diga N, estr</ITA_LIGHT_NAME> 
    </NTC_LIGHTLISTPRODUCT> 
</SECTION_CONTENT_LIST_ITEM> 
<SECTION_CONTENT_LIST_ITEM> 
     <NTC_LIGHTLISTPRODUCT>    
      <ITA_LIGHT_NUMBER>3429.2</ITA_LIGHT_NUMBER>    
      <VICINITY>CORIGLIANO CALABRO</VICINITY> 
      <ITA_LIGHT_NAME>Ingresso bacino di evoluzione;Molo S, estr</ITA_LIGHT_NAME> 
     </NTC_LIGHTLISTPRODUCT> 
</SECTION_CONTENT_LIST_ITEM> 
<SECTION_CONTENT_LIST_ITEM> 
    <NTC_LIGHTLISTPRODUCT> 
     <ITA_LIGHT_NUMBER>3429.55</ITA_LIGHT_NUMBER> 
     <VICINITY>CORIGLIANO CALABRO</VICINITY> 
     <ITA_LIGHT_NAME>Darsena N.2;Banchina N.4, spigolo S</ITA_LIGHT_NAME> 
    </NTC_LIGHTLISTPRODUCT> 
</SECTION_CONTENT_LIST_ITEM> 
<SECTION_CONTENT_LIST_ITEM> 
    <NTC_LIGHTLISTPRODUCT> 
     <ITA_LIGHT_NUMBER>3427</ITA_LIGHT_NUMBER> 
     <VICINITY>FIUME TRIONTO</VICINITY> 
     <ITA_LIGHT_NAME>Impianto di maricoltura</ITA_LIGHT_NAME> 
    </NTC_LIGHTLISTPRODUCT> 
</SECTION_CONTENT_LIST_ITEM> 
<SECTION_CONTENT_LIST_ITEM> 
    <NTC_LIGHTLISTPRODUCT> 
     <ITA_LIGHT_NUMBER>3614.3</ITA_LIGHT_NUMBER> 
     <VICINITY>FRIGOLE</VICINITY> 
     <ITA_LIGHT_NAME>Area di protezione e sviluppo delle risorse biologiche marine;Boa B3</ITA_LIGHT_NAME> 
    </NTC_LIGHTLISTPRODUCT> 
</SECTION_CONTENT_LIST_ITEM>   
<SECTION_CONTENT_LIST_ITEM> 
    <NTC_LIGHTLISTPRODUCT>    
     <ITA_LIGHT_NUMBER>1577</ITA_LIGHT_NUMBER> 
     <VICINITY>GENOVA</VICINITY> 
     <ITA_LIGHT_NAME>Granarolo</ITA_LIGHT_NAME> 
    </NTC_LIGHTLISTPRODUCT> 
</SECTION_CONTENT_LIST_ITEM> 

답변

1

데이터를 행에 배열하는 것 이상의 작업을 수행하려는 것 같습니다. 예를 들어, ACCIAROLI이 두 번 발생하지만 한 행만 필요하기 때문에 그룹화 할 수도 있습니다.

실제로 살펴 봐야 할 것은 Muenchian Grouping이라는 기술입니다. 앞의 요소를 지속적으로 확인하는 것보다 효율적이기 때문에 여기에서 확인하십시오. 귀하의 경우에는

, 당신과 같이 키를 정의 할 :

<xsl:key name="prod_by_vicinity" match="NTC_LIGHTLISTPRODUCT" use="VICINITY" /> 

내가 여기 NTC_LIGHTLISTPRODUCT을 그룹화하고, 그 다음 쉽게 VICINITY

이외의 요소에 대해 다른 값을 얻을 수 있기 때문에 다음과 같이 다음, 별개의 VICINITY 값을 얻을 것입니다 :

<xsl:variable name="distinct" select="//NTC_LIGHTLISTPRODUCT[generate-id() = generate-id(key('prod_by_vicinity', VICINITY)[1])]" /> 

행을 생성, 당신 ONL를 시작하려면 Y는 첫 번째 셀에 제품을 얻으려면 (내가 paramterised했습니다 여기에 행의 수)이 노드 세트의 첫 번째 5 (50) 노드를 선택

<xsl:for-each select="$distinct[position() &lt;= $rows]"> 

필요하고, 두 번째의 제품 행의 셀은, 당신은이 작업을 수행 할 수 있습니다

<xsl:apply-templates select="."/> 
<xsl:apply-templates select="$distinct[$pos + $rows]" /> 

이 XSLT에게

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="yes" /> 
    <xsl:param name="rows" select="5" /> 
    <xsl:key name="prod_by_vicinity" match="NTC_LIGHTLISTPRODUCT" use="VICINITY" /> 

    <xsl:template match="/"> 
    <xsl:variable name="distinct" select="//NTC_LIGHTLISTPRODUCT[generate-id() = generate-id(key('prod_by_vicinity', VICINITY)[1])]" /> 
    <table border="1"> 
     <xsl:for-each select="$distinct[position() &lt;= $rows]"> 
     <xsl:variable name="pos" select="position()" /> 
     <tr> 
      <xsl:apply-templates select="."/> 
      <xsl:apply-templates select="$distinct[$pos + $rows]" /> 
     </tr> 
     </xsl:for-each>  
    </table> 
    </xsl:template> 

    <xsl:template match="NTC_LIGHTLISTPRODUCT"> 
     <td> 
     <xsl:value-of select="VICINITY" /> 
     <xsl:text> </xsl:text> 
     <xsl:for-each select="key('prod_by_vicinity', VICINITY)"> 
      <xsl:if test="position() > 1"> - </xsl:if> 
      <xsl:value-of select="ITA_LIGHT_NUMBER" /> 
     </xsl:for-each> 
     </td> 
    </xsl:template> 
</xsl:stylesheet> 

참고하십시오 : 여기 큰 가정을 만들었습니다. 데이터가 이미 입력 XML에서 VICINITY으로 정렬되었다고 가정했습니다. 그렇지 않은 경우에는 더 복잡해지고 위의 변환을 수행하기 전에 두 패스 변환을 수행하여 정렬되도록해야 할 필요가있을 것입니다.

+0

친애하는 Tim이 2 칼럼을 제공하지 않습니다. 감사 . –

+0

두 개의 열이 있다고 생각합니다. 더 명확하게하기 위해 테이블에 테두리를 추가했습니다. http://www.xboxplayground.com/NTvfek –

+0

Ok Tim, 올바른 위치에 코드를 입력하는 것이 잘못되었습니다. 감사. –

관련 문제