2014-02-28 43 views
0

首先,我試圖在XSLT,XPath和XSL-FO的幫助下從XML創建PDF。如何用XSLT/XSL-FO壓縮相同的腳註?

我有一個帶有多個腳註的XML,我使用一個模板在標籤名稱「note」後自動呈現它們。

XML:

<document> 
    <ul type='custom-list-1' startdist="0.5cm" gap="0.15cm"> 
    <li space-before="30pt"> 
     List-item 1 
     <block margin-left="-15pt" margin-right="-15pt" text-align="center"> 
      <table layout="fixed" width="100%"> 
       <col number="1" width="30%" /> 
       <col number="2" width="17%" /> 
       <col number="3" width="17%" /> 
       <col number="4" width="17%" /> 
       <col number="5" width="17%" />      
       <tbody> 
        <tr font-style="italic"> 
         <th>sample title</th> 
         <th colspan="4">sample title</th> 
        </tr>      
        <tr> 
         <td> 
          Bla bla bla 
          <note name="name-1"> 
           Footnote for "bla bla bla" 
          </note> 
         </td> 
         <td colspan="4"> 
          ............. 
         </td> 
        </tr>     
        <tr> 
         <td> 
          Comision Administrare Online Banking 
         </td> 
         <td colspan="4"> 
          ......... 
         </td> 
        </tr> 
        <tr> 
         <td> 
          Another... Bla bla bla 
          <note name="name-2"> 
           Footnote for "Another... Bbla bla bla" 
          </note> 
         </td> 
         <td colspan="4"> 
          ...... 
         </td> 
        </tr>      
       </tbody>     
      </table>        
     </block> 
    </li> 
    <li space-before="30pt">List-item 2:   

     <block margin-left="-15pt" text-align="center"> 
      <table layout="fixed" width="100%"> 
       <col number="1" width="18%" /> 
       <col number="2" width="13%" /> 
       <col number="3" width="13%" /> 
       <col number="4" width="16%" />     
       <col number="5" width="13%" /> 
       <col number="6" width="13%" /> 
       <col number="7" width="13%" /> 
       <tbody> 
        <tr font-style="italic"> 
         <th colspan="2" rowspan="2">Sample title</th> 
         <th colspan="2">Sample title</th>      
         <th rowspan="2">Sample title</th> 
         <th rowspan="2">Sample title</th> 
         <th rowspan="2">Sample title</th> 
        </tr> 
        <tr font-style="italic"> 
         <th>Min</th> 
         <th>Max</th> 
        </tr>      
        <tr>        
         <td colspan="2">Some text here</td> 
         <td colspan="2"> 
          1% 
          <note name="name-3"> 
           Footnote for "1%" 
          </note> 
          /0.5% 
          <note name="name-4"> 
           Footnote for "0.5%" 
          </note> 
         </td> 
         <td>-</td> 
         <td>-</td> 
         <td>-</td>       
        </tr>      
        <tr>        
         <td colspan="2">Sample text</td> 
         <td colspan="2"> 
          1% 
          <note name="name-3"> 
           Footnote for "1%" 
          </note> 
          /0.5% 
          <note name="name-4"> 
           Footnote for "0.5%" 
          </note> 
         </td> 
         <td>-</td> 
         <td>-</td> 
         <td>-</td>       
        </tr>      
        <tr>        
         <td colspan="2">Sample text</td> 
         <td colspan="2"> 
          1% 
          <note name="name-3"> 
           Footnote for "1%" 
          </note> 
          /0.5% 
          <note name="name-4"> 
           Footnote for "0.5%" 
          </note> 
         </td> 
         <td>-</td> 
         <td>-</td> 
         <td>-</td>       
        </tr>      
       </tbody> 
      </table> 
     </block> 
    </li> 
    <li space-before="30pt">List-item 3 
     <block margin-left="-15pt" text-align="center"> 
      <table layout="fixed" width="100%"> 
       <col number="1" width="25%" /> 
       <col number="2" width="15%" /> 
       <col number="3" width="15%" /> 
       <col number="4" width="22%" /> 
       <col number="5" width="22%" />      
       <tbody> 
        <tr font-style="italic"> 
         <th colspan="2">Sample title</th> 
         <th></th> 
         <th>Sample title</th> 
         <th>Sample title</th> 
        </tr> 
        <tr>        
         <td colspan="2">Sample text</td>        
         <td></td> 
         <td>0%</td> 
         <td>0%</td> 
        </tr> 
        <tr>        
         <td colspan="2">Sample text</td>        
         <td></td> 
         <td>0.05%<note name="name-5">Footnote for "0.05%"</note></td> 
         <td>0.05%</td> 
        </tr>      
        <tr>        
         <td colspan="2">Sample text</td>        
         <td></td> 
         <td>0%</td> 
         <td>0%</td> 
        </tr> 
       </tbody> 
      </table> 

     </block> 
    </li>  
</ul> 

XSLT:

<xsl:attribute-set name="note.data" > 
    <xsl:attribute name="text-align">justify</xsl:attribute>   
    <xsl:attribute name="font-weight">normal</xsl:attribute> 
</xsl:attribute-set> 

<xsl:key name="by-name" match="//note[@name]" use="@name" /> 

<xsl:template match="note"> 
    <xsl:call-template name="note" /> 
</xsl:template> 

<xsl:template name="note"> 
    <xsl:param name="unique-elements" 
     select="current()[generate-id(.) = generate-id(key('by-name', @name)[1])]"/>  
    <xsl:param name="identical-elements" 
     select="current()[not(generate-id(.) = generate-id(key('by-name', @name)[1]))]"/> 

    <xsl:if test="$unique-elements"> 
     <xsl:variable name="element" select="$unique-elements"/> 

     <fo:footnote>  
      <fo:inline baseline-shift="super" font-size="75%" color="red"> 
       <xsl:number level="any" count="//note[generate-id(.) = generate-id(key('by-name', @name)[1])]" format="(1)" /> 
      </fo:inline> 

      <fo:footnote-body xsl:use-attribute-sets="note.data"> 
       <fo:block color="blue">        
        <fo:inline baseline-shift="super" font-size="75%"> 
         <xsl:number level="any" count="//note[generate-id(.) = generate-id(key('by-name', @name)[1])]" format="(1)" /> 
        </fo:inline> 
        <xsl:value-of select="$element" />            
       </fo:block> 
      </fo:footnote-body> 
     </fo:footnote>   
    </xsl:if>   

    <xsl:if test="$identical-elements"> 
     <fo:inline baseline-shift="super" font-size="75%" color="green"> 
      <xsl:number level="any" count="//note[generate-id(.) = generate-id(key('by-name', @name)[1])]" format="(1)" /> 
     </fo:inline>    
    </xsl:if> 
</xsl:template> 

PDF輸出:

enter image description here

因此,我設法壓制相同的腳註並保持唯一腳註的計數(圖像用紅色着色),併爲相同的腳註(用綠色着色的圖像)添加最後的計數值。

現在的問題是,我無法弄清楚如何爲相同的腳註保持相同的計數值。

在此先感謝!

+0

您想在哪裏放置select語句?或者應該是匹配語句並替換你的''?你也可以展示你的一些源代碼XML,也許更多的是你的樣式表,這可能與模板應用在哪裏有所不同。 –

+0

@TobiasKlevenz - 我編輯了這篇文章。現在我認爲足以做出一個想法......謝謝。 –

+0

對不起,我還是不太明白你想要的輸出是什麼。我的猜測是你想要繼續計算相同的腳註,所以綠色4將是5,6,7,8,並且比你的頁腳線更適合那些閱讀(4)(5)(6)(7)(8)腳註「0,5%」......這是正確的嗎? –

回答

1

所以這裏是一個解決方案,但沒有使用XSL:數量,通常給了我太多的頭疼,但是既然你已經使用水平=「任何」,它並不真正的問題:

<xsl:template match="note"> 
    <!-- 
     counts unique preceding notes starting from first note with current @name 
    --> 
    <xsl:variable name="number" 
     select="count((//note[@name=current()/@name])[1]/preceding::note[not(@name=../preceding::note/@name)]) + 1"/> 

    <xsl:choose> 
     <!-- if there is no preceding note with same name --> 
     <xsl:when test="not(preceding::note/@name=current()/@name)"> 
      <fo:footnote> 
       <fo:inline baseline-shift="super" font-size="75%" color="red">(<xsl:value-of 
         select="$number"/>)</fo:inline> 

       <fo:footnote-body> 
        <fo:block color="blue"> 
         <xsl:if test="@margin-left"> 
          <xsl:attribute name="margin-left"> 
           <xsl:value-of select="@margin-left"/> 
          </xsl:attribute> 
         </xsl:if> 
         <fo:inline baseline-shift="super" font-size="75%">(<xsl:value-of select="$number" 
          />)</fo:inline> 
         <xsl:value-of select="."/> 
        </fo:block> 
       </fo:footnote-body> 

      </fo:footnote> 
     </xsl:when> 
     <xsl:otherwise> 
      <fo:inline baseline-shift="super" font-size="75%" color="red">(<xsl:value-of 
        select="$number"/>)</fo:inline> 
     </xsl:otherwise> 
    </xsl:choose> 


</xsl:template> 
+0

謝謝你!這是我尋找的解決方案。我只有1-2周的XML/XSLT/XPath/XSL-FO,所以我找不到或理解所有的東西,但通過練習,我希望我能做到。再次感謝! –

1

最好的辦法是對相同的筆記進行分組,然後選擇每組中的第一筆筆記。使用XSLT 2.0,您可以使用group-by屬性。在XSLT 1.0,你可以做到這一點創建的所有音符鍵:

<xsl:key name="notes" match="//note" use="@name"/> 

,然後調用使用謂詞您的模板如下圖所示:與

<xsl:template match="parent-element"> 
... 
    <xsl:apply-templates select="note[generate-id(.) = generate-id(key('notes', @name)[1])]" /> 
... 
</xsl:template> 

表達比較當前note.note的第一項與@name相同,因此您要選擇每個組的第一項。

你也必須解決您的節點數量,其限制爲縮減集合(因爲它是計算包括重複者的所有節點):

note[generate-id(.) = generate-id(key('notes', @name)[1])] 
+1

感謝您的及時答覆,但我已經在其他帖子中找到了類似的答案,並在新編輯中更新了這一答案。我還添加了帶有測試PDF的打印屏幕,您可以看到那裏有新問題。 –