2014-12-02 55 views
0

我想創建一個索引垂直兩列,每列有50行。Xslt索引垂直兩列(50行)

<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> 

這是我的輸出: - 2666.5

阿恰羅利........... 2665.3

我使用該XSLT創建了一個簡單垂直指數(成一列)
AMENDOLARA .......... 3431.25
ANCONA .............. 3921.9
BRINDISI ............ 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 Ÿ需要選擇在這個節點集中的前5個(或50)個節點(我paramterised行此數)

<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

親愛的蒂姆,這不給2列。謝謝 。 – 2014-12-02 14:02:30

+0

我相信這確實給出了兩欄。我在表格中添加了一個邊框以使其更加清晰。你可以在http://www.xmlplayground.com/NTvfek – 2014-12-02 14:05:56

+0

看到它的行動好吧蒂姆,我錯了在正確的位置輸入代碼。謝謝。 – 2014-12-02 17:01:59