2014-06-29 53 views
0

我已經XML從搜索引擎回來與節點像這樣有%26的XSLT更換& 1.0

<team>Some team name with &amp;</team> 

我需要一個團隊的鏈接,雖然它可能不是最佳的方式,工作,直到我發現有些球隊的名字包括符號

我所擁有的是(球隊加了雙引號)

<xsl:variable name="teamend" select="concat(team,'%22')"/> 
<a href="{concat('http://site/page.aspx?k=team%3D%22', $teamend)}"> 
    <xsl:call-template name="DisplayCustomField"> 
    <xsl:with-param name="customfield" select="team" /> 
    </xsl:call-template> 

,但如果球隊含有&林k將被打破,我怎麼能最好的解決這個問題?

在此先感謝

+1

有幾種方法可以在XSLT 1.0中執行URL編碼(http://stackoverflow.com/search?q=url+encode+xslt+1.0)(遺憾的是,沒有內置函數) 。哪種方式適合您取決於您​​的XSLT處理器。 – Tomalak

回答

0

您可以使用此命名模板並使用team的字符串之前調用它:

<xsl:template name="replace"> 
    <xsl:param name="string"/> 
    <xsl:param name="substring"/> 
    <xsl:param name="replacement"/> 
    <xsl:choose> 
     <xsl:when test="contains($string, $substring)"> 
      <xsl:value-of select="substring-before($string, $substring)"/> 
      <xsl:value-of select="$replacement"/> 
      <xsl:call-template name="replace"> 
       <xsl:with-param name="substring" select="$substring"/> 
       <xsl:with-param name="replacement" select="$replacement"/> 
       <xsl:with-param name="string" select="substring-after($string, $substring)"/> 
      </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="$string"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

你可以這樣調用它,並用另一個替換任何字符串:

<xsl:variable name="string-with-escaped-ampersand"> 
    <xsl:call-template name="replace"> 
     <xsl:with-param name="string" select="team"/> 
     <xsl:with-param name="substring">&amp;</xsl:with-param> 
     <xsl:with-param name="replacement">%26</xsl:with-param> 
    </xsl:call-template> 
</xsl:variable> 

而在你的代碼中使用它:

<xsl:variable name="teamend" select="concat($string-with-escaped-ampersand,'%22')"/> 

正如@Tomalak在評論中指出的那樣,由於您正在生成一個URL,因此您可能需要處理需要編碼的其他幾個字符。在XSLT 2.0中有這些功能,但在XSLT 1.0中,您將被限制爲模板或擴展。

+0

在這種情況下,對正確的URL編碼建議可能更有用。 – Tomalak