2013-06-24 164 views
2

我有一個基本上是搜索應用程序的程序,它以VBScript和Perl的形式存在(我試圖用GUI做一個可執行文件)。XSLT樣式表適用於vbs腳本,但不適用於Perl

當前搜索應用程序輸出一個HTML文件,並且如果HTML中的一段文本長於十二行,那麼它將隱藏任何內容幷包含可點擊的More...標記。

這是在XSLT中完成的,並且適用於VBScript。

我從字面上將樣式表複製並粘貼到我正在使用的Perl程序中,它除了處理More...標籤之外,其他所有事情都是正確的。

是否有任何理由,它會使用VBScript而不是Perl?

我的Perl腳本使用XML::LibXSLT,這裏是應該被創建More...標籤

<xsl:template name="more"> 

    <xsl:param name="text"/> 
    <xsl:param name="row-id"/> 
    <xsl:param name="cycle" select="1"/> 

    <xsl:choose> 

    <xsl:when test="($cycle &gt; 12) and contains($text,'&#13;')"> 
     <span class="show" onclick="showID('SHOW{$row-id}');style.display = 'none';">More...</span> 
     <span class="hidden" id="SHOW{$row-id}"> 
     <xsl:call-template name="highlight"> 
      <xsl:with-param name="text" select="$text"/> 
     </xsl:call-template> 
     </span> 
    </xsl:when> 

    <xsl:when test="contains($text,'&#13;')"> 
     <xsl:call-template name="highlight"> 
     <xsl:with-param name="text" select="substring-before($text,'&#13;')"/> 
     </xsl:call-template> 
     <xsl:text>&#13;</xsl:text> 
     <xsl:call-template name="more"> 
     <xsl:with-param name="text" select="substring-after($text,'&#13;')"/> 
     <xsl:with-param name="row-id" select="$row-id"/> 
     <xsl:with-param name="cycle" select="$cycle + 1"/> 
     </xsl:call-template> 
    </xsl:when> 

    <xsl:otherwise> 
     <xsl:call-template name="highlight"> 
     <xsl:with-param name="text" select="$text"/> 
     </xsl:call-template> 
    </xsl:otherwise> 

    </xsl:choose> 

</xsl:template> 
+1

你用什麼來處理XSLT?這可能是因爲你依賴未指定的行爲或者一個實現有bug。或者你可能已經忘記了一個選項,誰知道。爲了讓您的問題能夠回答,您必須添加XSLT處理器信息,並且理想情況下允許我們重現問題的一些代碼。 – amon

+0

@amon我添加了代碼和我正在使用的perl模塊。 – OstrichProjects

回答

2

我相信問題是,你的XSLT正在搜索的文本字符CR模板 - &#13;

Windows文件使用CR LF字符對來終止每行文本,並且在Windows系統上運行的Perl版本將剝離CR以僅留下LF

這提供了一個與Linux-like系統兼容的API,它首先使用LF,但意味着您的XSLT樣式表在查找它們時找不到任何CR字符。

我建議你改變你的樣式表來搜索LF字符,它會出現在每一行的末尾,不管文件的來源如何,並且Perl和VBScript都會看到這些字符。

我認爲字符代碼最好用十六進制表示,所以您應該在整個XSLT代碼中將'&#13;更改爲'&#x0A;

注意

這樣調整你的字符串將留下一個尾隨CR您使用substring-before($text, '&#x0A;')後。您可以在地方—離開這個我不認爲它會做任何傷害,因爲它不會被瀏覽器—渲染,或者你可以從你傳遞給當你把它叫做more模板字符串中刪除

<xsl:call-template name="more"> 
    <xsl:with-parameter name="text" value="translate($text, '&#x0D;', '')"/> 
    ... 
</xsl:call-template> 

這將使模板留下一個乾淨的字符串進行處理,不包含CR字符。

+0

謝謝,這似乎是有效的(不改變我的模板調用內的任何東西。 – OstrichProjects

相關問題