2017-08-07 85 views
0

在獲得提示後:xslt string replace concrete example, 我已將這兩個模板用於我自己的環境中。 他們使用的HTML表,以便從另一個的.xsl模板調用第二個模板(FHB-圍兜,資訊),當得到一些格式化完成:嘗試運行XSL模板時出現錯誤

<xsl:template name="string-replace-all"> 
    <xsl:param name="text" /> 
    <xsl:param name="replace" /> 
    <xsl:param name="by" /> 
    <xsl:choose> 
     <xsl:when test="$text = '' or $replace = ''or not($replace)" > 
      <!-- Prevent this routine from hanging --> 
      <xsl:value-of select="$text" /> 
     </xsl:when> 
     <xsl:when test="contains($text, $replace)"> 
      <xsl:value-of select="substring-before($text,$replace)" /> 
      <xsl:value-of select="$by" /> 
      <xsl:call-template name="string-replace-all"> 
       <xsl:with-param name="text" select="substring-after($text,$replace)" /> 
       <xsl:with-param name="replace" select="$replace" /> 
       <xsl:with-param name="by" select="$by" /> 
      </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="$text" /> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 


<xsl:template name="fhb-bib-info"> 
    <xsl:choose> 
    <xsl:when test="./bib-info =''"> 
     <tr> 
     <td colspan="2"><xsl:text>Autor: </xsl:text><xsl:value-of select="./z13-author"/></td> 
     </tr> 
     <tr> 
     <td colspan="2"><xsl:text>Titel: </xsl:text><xsl:value-of select="./z13-title"/></td> 
     </tr> 
     <tr> 
     <td colspan="2"><xsl:text>ISBN/ISSN: </xsl:text><xsl:value-of select="./z13-isbn-issn"/></td> 
     </tr> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:template match="bib-info"> 
     <xsl:variable name="newtext"> 
      <xsl:call-template name="string-replace-all"> 
      <xsl:with-param name="text" select="text()" /> 
      <xsl:with-param name="replace" select="']:       '" /> 
      <xsl:with-param name="by" select="']: '" /> 
      </xsl:call-template> 
     </xsl:variable> 
     </xsl:template> 
     <tr> 
     <td colspan="2"><bib-info><xsl:value-of select="$newtext" /></bib-info></td> 
     </tr> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

但是,當我試圖運行它們,我得到了以下錯誤。這兩個模板是funcs.xsl文件的一部分。第153行是出現select =「$ newtext」語句的xsl:value的地方。

任何人都可以幫助我調試/清除這些錯誤消息嗎?凱特

Error at xsl:value-of on line 153 of file:/C:/Aleph-22-Test/alephcom/files/SWF50/PrintTemplates/ger/funcs.xsl: 
    XPST0008: XPath syntax error at char 8 on line 153 in {$newtext}: 
    Variable $newtext has not been declared 
Error at xsl:template on line 143 of file:/C:/Aleph-22-Test/alephcom/files/SWF50/PrintTemplates/ger/funcs.xsl: 
    XTSE0010: An xsl:otherwise element must not contain an xsl:template element 
Error at xsl:template on line 143 of file:/C:/Aleph-22-Test/alephcom/files/SWF50/PrintTemplates/ger/funcs.xsl: 
    XTSE0010: Element must be used only at top level of stylesheet 
+0

我發現,我在我的腳本所做的錯誤! ''可能不是''-loop的一部分,因爲它是一個類似於'-call 。 –

+0

直到現在我才知道。 任何人都可以幫助我重寫腳本,使「replace-action」適合於「外部可調用的模板」嗎?我不知道如何描述它。 –

回答

0

與同事,我設法解決我的問題和調試我的代碼,使我的模板現在被通緝的工作的幫助。我的邏輯中的關鍵缺陷是我期望在替換操作之後必須特別顯示bib-info元素。我發現情況並非如此。

另一件事是需要對替換操作進行recursiv調用,因爲只有blanc被替換而不是整個組合。

因此,這裏的工作代碼:

<xsl:template name="plain-fhb-bib-info"> 
    <xsl:choose> 
    <xsl:when test="./bib-info =''"> 
     <xsl:text>Autor: </xsl:text><xsl:value-of select="./z13-author"/><xsl:call-template name="new-line"/> 
     <xsl:text>Titel: </xsl:text><xsl:value-of select="./z13-title"/><xsl:call-template name="new-line"/> 
     <xsl:text>ISBN/ISSN: </xsl:text><xsl:value-of select="./z13-isbn-issn"/><xsl:call-template name="new-line"/> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:call-template name="plain-string-replace-all-recursive"> 
     <xsl:with-param name="text" select="./bib-info" /> 
     <xsl:with-param name="replace" select="']: '" /> 
     <xsl:with-param name="by" select="']: '" /> 
    </xsl:call-template> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 


<!-- recursively applies plain-string-replace-all until there are no more matches --> 
<xsl:template name="plain-string-replace-all-recursive"> 
    <xsl:param name="text" /> 
    <xsl:param name="replace" /> 
    <xsl:param name="by" /> 
    <xsl:choose> 
    <xsl:when test="contains($text, $replace)"> 
     <xsl:variable name="newtext"> 
     <xsl:call-template name="plain-string-replace-all"> 
     <xsl:with-param name="text" select="$text" /> 
     <xsl:with-param name="replace" select="$replace" /> 
     <xsl:with-param name="by" select="$by" /> 
     </xsl:call-template> 
     </xsl:variable> 
     <xsl:call-template name="plain-string-replace-all-recursive"> 
     <xsl:with-param name="text" select="$newtext" /> 
     <xsl:with-param name="replace" select="$replace" /> 
     <xsl:with-param name="by" select="$by" /> 
     </xsl:call-template> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="$text" /> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 


<xsl:template name="plain-string-replace-all"> 
    <xsl:param name="text" /> 
    <xsl:param name="replace" /> 
    <xsl:param name="by" /> 
    <xsl:choose> 
    <xsl:when test="$text = '' or $replace = ''or not($replace)" > 
     <xsl:value-of select="$text" /> 
    </xsl:when> 
    <xsl:when test="contains($text, $replace)"> 
     <xsl:value-of select="substring-before($text,$replace)" /> 
     <xsl:value-of select="$by" /> 
     <xsl:call-template name="plain-string-replace-all"> 
     <xsl:with-param name="text" select="substring-after($text,$replace)" /> 
     <xsl:with-param name="replace" select="$replace" /> 
     <xsl:with-param name="by" select="$by" /> 
     </xsl:call-template> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="$text" /> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
相關問題