2009-06-18 8 views
0

Ich verwende XSL, um eine XML-Darstellung einer E-Mail-Nachricht in Browsern anzuzeigen. E-Mail-Anhänge werden in separaten Dateien in der Haupt-E-Mail-XML-Datei gespeichert. Daher möchte ich, dass die resultierende Webseite für die E-Mail einen Link zu ihren Anhängen enthält.So stoppen Sie XSL-Unescaping-URLs

Einige der Anhänge sind jedoch E-Mail-Nachrichten selbst und möglicherweise Weiterleitungen oder Antworten und daher möglicherweise Namen mit Doppelpunkten wie enthalten. FW: Wichtig. Der Name lautet URL-maskiert als FW% 3AImportant und wird als Datei gespeichert unter FW% 3AImportant.xml.

Das Problem ist, dass die URL in meiner XSL-produzierten Webseite unescaped ist und wieder den Doppelpunkt (file: // FW: Important.xml) enthält und somit ein defekter Link ist. Was ist der beste Weg, um dieses Verhalten zu stoppen? Hier

ist der XML-Schnipsel:

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

Und hier ist der XSL-Schnipsel:

<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> 

Antwort

0

Ich glaube, Sie auf dem Holzweg sind hier. Es ist nicht XSLT, die Ihre URL unescapes, es ist der Browser.

Die einzigen Escape-Sequenzen, die XML (und damit XSLT) bekannt sind, haben die Form "&xxx;". Die "%xx" Ihrer URL-Strings bleibt unverändert.

Das Problem ist, dass Ihre <a href="..."> enthält genau die Zeichenfolge, die der Browser versucht es mit. Sie tun also etwas falsch beim Kodieren der URL.

Wenn die Datei auf dem Dateisystem als gespeichert:

FW%3AImportant.xml

dann die korrekte URL muss zu verweisen sein:

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

Dies bedeutet, dass Sie die Zeichenfolge URL-Codierung haben Bevor Sie es in ein href Attribut platzieren, wie in jedem anderen System, das HTML generiert.

Leider gibt es in XSLT keine systemeigene URL-Encoding-Funktion. Dies bedeutet, dass Sie entweder eine Erweiterungsfunktion Ihrer XSLT-Umgebung verwenden oder die Codierung in einer separaten Vorlage mithilfe von XPath-Zeichenfolgenfunktionen durchführen können. Da die korrekte URL-Codierung nicht gerade trivial ist, empfehle ich, etwas Bewährtes hier zu verwenden. Hier ist ein Stylesheet, das Sie referenzieren können (<xsl:import>), das macht es für Sie: http://skew.org/xml/stylesheets/url-encode/

+0

Das macht Sinn, ich werde es versuchen. Ich hatte mir das Stylesheet bereits angesehen, aber ich hatte auf eine einfachere Antwort gehofft! – jwaddell