2012-08-31 11 views
0

我正在嘗試使用XML和XSLT文件實現FOP來輸出PDF。用FOP修復PDF中一個單詞的位置

我的問題是我需要修復了一行字的位置(而不是通過使用表)以下,例如:

我有以下XML:

<address> 
    <Line1 length="32" noLine="5" col="60" /> 
    <Line2 length="32" noLine="6" col="60">Mr. John Kane</Line2 > 
    <Line3 length="32" noLine="7" col="60">15 Street Springfield</Line3 > 
    <Line4 length="32" noLine="8" col="60" /> 
    <Line5 length="32" noLine="9" col="60" /> 
    <Line6 length="6" noLine="10" col="60">75009</Line6 > 
    <Line7 length="25" noLine="10" col="67">Freesberg</Line7 > 
    <Line8 length="25" noLine="11" col="67">Idaho</Line8 > 
    </address> 
  1. 在哪裏該length是單詞/句子長度
  2. noLine是行號
  3. col在開始口服該行中的單詞/句子的位置

我做了行,但我似乎無法在行中的正確位置(列)插入單詞/句子。

這是我的XSLT部分:

<fo:block font-size="10" font-family="monospace"> 
<xsl:for-each select="*"> 
<xsl:variable name="currentNode" select ="name(.)"/> 

<xsl:choose> 
<xsl:when test="$currentNode = 'address'"> 
               <xsl:for-each select="*"> 
                <xsl:variable name="length" select ="@length"/> 
                <xsl:variable name="noLine" select ="@noLine"/> 
                <xsl:variable name="col" select ="@col"/> 
                <xsl:variable name="precNoLig" select = "preceding-sibling::*[1]/@noLine"/> 
                <xsl:choose> 
                 <xsl:when test="$precNoLig = $noLine"> 
                  <fo:block font-size="10" font-family="monospace" text-indent="60"> 
                   &#160;<xsl:value-of select="." /> 
                  </fo:block> 
                 </xsl:when> 
                 <xsl:otherwise> 
                  <!--<fo:block font-size="10" font-family="monospace" >--> 
                   &#x2028;<xsl:value-of select="." /> 
                  <!--</fo:block>--> 
                 </xsl:otherwise> 
                </xsl:choose> 
               </xsl:for-each> 
    </xsl:when> 
    </xsl:choose> 

    </xsl:for-each> 
    </fo:block> 

這是預期的輸出爲PDF

          Mr. John Kane 
             15 Street Springfield 


             75009 Freesberg 
               Idaho 

如果它在PDF(COL)以下職位:

<-----------------60--------------------> 
<-----------------60-------------------->Mr. John Kane 
<-----------------60-------------------->15 Street Springfield 
<-----------------60--------------------> 
<-----------------60--------------------> 
<-----------------60-------------------->75009 Freesberg 
<-----------------67-------------------------->Idaho 

任何幫助,將不勝感激。

+0

@DimitreNovatchev這很簡單:我將'xslt'和'xml'文件傳遞給FOP,它爲我生成'PDF' – GingerHead

+0

仍然沒有轉換的預期/希望輸出 - 應該是生成的XSL-FO,然後將其提供給格式化程序。請添加這個缺少的信息。 –

+0

Mike,對不起,但添加的不是來自XSLT轉換的輸出 - 它是來自FOP的輸出。請提供XSLT轉換所需的輸出。 –

回答

1

這是一個有點費解,但這應該工作:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:strip-space elements="*" /> 
    <xsl:output method="text"/> 

    <xsl:variable name="sp" select="'                       '" /> 

    <xsl:template match="address/*"> 
    <xsl:variable name="value"> 
     <xsl:value-of select="." /> 
     <xsl:if test="following-sibling::*[1]/@noLine = @noLine"> 
     <xsl:value-of select="$sp" /> 
     </xsl:if> 
    </xsl:variable> 
    <xsl:choose> 
     <xsl:when test="preceding-sibling::*[1]/@noLine = @noLine"> 
     <xsl:variable name="col" select="preceding-sibling::*[1]/@col + preceding-sibling::*[1]/@length" /> 
     <xsl:value-of select="concat(substring($sp,1,@col - $col),substring($value,1,@length))" /> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:if test="preceding-sibling::*"><xsl:text>&#10;</xsl:text></xsl:if> 
     <xsl:value-of select="concat(substring($sp,1,@col),substring($value,1,@length))" /> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

對於這種變換工作原來的樣子,它的關鍵,你Line..元素在noLine/col順序,因爲它立足如何填充它放在前一個元素上。如果它們出現故障,它會發生嚴重錯誤。

sp變量必須至少包含儘可能多的空間,你永遠需要墊出來給的,即任何lengthcol屬性的最大值。這個解決方案不包括在一行尾部的空格 - 實際上它更容易用拖尾空格填充每行,以便填充給定的長度,但我認爲它可能最好不要。

我只用給出的示例嘗試過,如果它不適用於任何其他輸入,請告訴我,我會看看我是否可以調整它。

編輯:我只是注意到,你需要它在PDF格式,對不起。我只是看着輸出,並沒有注意到格式。希望你可以根據你需要的格式來調整它(它實際上與你已經嘗試過的格式非常相似),但是如果不是,我建議你手動創建一個表示你的輸出的PDF,並將該PDF的XML添加到你的題。

+0

不幸的是,不幸的是。有一種編寫輸出給定數量空格的模板的方法,但是它會比該樣式表的長度增加一倍以上。對於這樣的硬編碼字符串的子字符串,通常很容易獲得,因爲您需要了解最大長度。 – Flynn1179

+0

它的變化無關緊要,只是它足夠長以覆蓋源XML中任何位置的最大值。在這種情況下,我認爲有足夠的空間來覆蓋一條線的整個寬度應該是足夠的。當我有機會時,我會添加一個可以任意長度調用的模板,無論如何它通常很有用。 – Flynn1179