2009-06-18 8 views
0

J'utilise XSL pour afficher une représentation XML d'un message électronique dans les navigateurs. Les pièces jointes aux e-mails sont stockées dans des fichiers distincts dans le fichier XML de l'e-mail principal. Je souhaite donc que la page Web résultante de l'e-mail contienne un lien vers ses pièces jointes.Comment faire pour arrêter les URLs de désenchaînement XSL

Toutefois, certaines des pièces jointes sont des e-mails eux-mêmes, et peuvent avoir été vers l'avant ou des réponses et peuvent donc avoir des noms contenant des deux-points comme FW: Important. Le nom est protégé par l'URL FW% 3AImportant et enregistré en tant que fichier sous la forme FW% 3AImportant.xml.

Le problème est que l'URL dans ma page Web produite par XSL est non échappée et contient encore une fois les deux points (fichier: // FW: Important.xml) et est donc un lien brisé. Quel est le meilleur moyen d'arrêter ce comportement?

Voici l'extrait de code XML:

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

Et voici l'extrait de 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> 

Répondre

0

Je pense que vous êtes sur la mauvaise voie ici. Ce n'est pas XSLT qui désapparaît votre URL, c'est le navigateur.

Les seules séquences d'échappement connues de XML (et donc de XSLT) sont sous la forme "&xxx;". Le "%xx" de vos chaînes d'URL est laissé inchangé.

Le problème est que votre <a href="..."> contient exactement la chaîne avec laquelle le navigateur l'essaie. Donc, vous faites quelque chose de mal lors de l'encodage de l'URL.

Lorsque le fichier sur le système de fichiers est stocké comme:

FW%3AImportant.xml

l'URL correcte pour le référencer doit être:

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

Cela signifie que vous devez encode la chaîne avant de le placer dans un attribut href, comme dans tout autre système qui génère du code HTML.

Malheureusement, il n'existe aucune fonction native de codage d'URL dans XSLT. Cela signifie que vous pouvez utiliser une fonction d'extension de votre environnement XSLT ou effectuer l'encodage dans un modèle distinct en utilisant les fonctions de chaîne XPath. Comme l'encodage d'URL correct n'est pas vraiment trivial, je recommande d'utiliser quelque chose de prouvé ici. Voici une feuille de style que vous pouvez référencer (<xsl:import>) qui le fait pour vous: http://skew.org/xml/stylesheets/url-encode/

+0

Cela a du sens, je vais essayer. J'avais déjà regardé cette feuille de style mais j'espérais une réponse plus simple! – jwaddell

Questions connexes