2009-06-18 74 views
0

我正在使用XSL在瀏覽器中顯示電子郵件消息的XML表示形式。電子郵件附件存儲在主電子郵件XML文件的單獨文件中,因此我希望電子郵件的結果網頁包含指向其附件的鏈接。如何停止XSL未修復的URL

但是,其中一些附件是電子郵件本身,可能已轉發或回覆,因此可能有名稱包含冒號如固件:重要。該名稱的網址轉義爲FW%3AI重要,並作爲文件存儲爲FW%3AImportant.xml

的問題是,在我的XSL-製作網頁的URL是轉義並再次包含冒號(文件:// FW:Important.xml),因此是一個破碎的鏈接。阻止這種行爲的最好方法是什麼?

這裏是XML片段:

<email:part email:filename="FW%3AImportant"> 
    <email:attachment filename="FW%3AImportant.xml"> 
     FW%3AImportant.xml 
    </email:attachment> 
</email:part> 

這裏是XSL片段:

<xsl:template match="email:email/email:parts"> 
    <xsl:for-each select="email:part/email:attachment"> 
     <a> 
      <xsl:attribute name="href"> 
       <xsl:value-of select="@filename" /> 
      </xsl:attribute> 
      <xsl:value-of select="@filename" /> 
     </a> 
    </xsl:for-each>    
</xsl:template> 

回答

0

我認爲你是在錯誤的軌道上這裏。它不是XSLT,它是你的URL,它是瀏覽器。

XML已知的唯一轉義序列(以及XSLT)的形式爲「&xxx;」。您的URL字符串的「%xx」保持不變。

問題是,您的<a href="...">包含瀏覽器正在嘗試使用的字符串。所以你在編碼URL時做錯了什麼。

當文件系統上的文件存儲爲:

FW%3AImportant.xml

那麼正確的網址引用它必須是:

<a href="FW%253AImportant.xml">FW%3AImportant.xml</a> 
<!-- ------^^^ the '%' char itself must be escaped! --> 

這意味着你必須進行URL編碼字符串然後將其放入href屬性中,就像在任何其他生成HTML的系統中一樣。

不幸的是,在XSLT中沒有原生的URL編碼功能。這意味着您可以使用XSLT環境的擴展函數,也可以使用XPath字符串函數在單獨的模板中進行編碼。由於正確的URL編碼不是微不足道的,我推薦使用在這裏證明的東西。這裏有一個你可以參考的樣式表(<xsl:import>):http://skew.org/xml/stylesheets/url-encode/

+0

這是有道理的,我會給它一個去。我已經看過那個樣式表,但我希望得到一個更簡單的答案! – jwaddell 2009-06-18 23:35:00