2009-07-09 8 views
3

J'écris un modèle XSLT qui doit générer un fichier xml valide pour un sitemap xml.XSLT - Remplacer l'apostrophe par du texte échappé dans la sortie

<url> 
<loc> 
    <xsl:value-of select="umbraco.library:NiceUrl($node/@id)"/> 
</loc> 
<lastmod> 
    <xsl:value-of select="concat($node/@updateDate,'+00:00')"/> 
</lastmod> 
</url> 

Malheureusement, URL qui est sortie contient une apostrophe - /what's-new.aspx

je dois échapper à la 'à &apos; pour Google Sitemap. Malheureusement chaque tentative que j'ai essayée traite la chaîne '&apos;' comme si c'était '' 'qui est invalide - frustrant. XSLT peut parfois me rendre fou.

Des idées pour une technique? (Supposons que je peux trouver mon chemin autour XSLT 1.0 modèles et fonctions)

Répondre

9

Vous avez ' dans votre entrée, mais vous devez la chaîne &nbsp; dans votre sortie?

Dans votre fichier XSL, remplacez &apos; avec &amp;apos;, en utilisant this find/replace implementation (sauf si vous utilisez XSLT 2.0):

<xsl:template name="string-replace-all"> 
    <xsl:param name="text"/> 
    <xsl:param name="replace"/> 
    <xsl:param name="by"/> 
    <xsl:choose> 
    <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> 

Appelez cette façon:

<loc> 
    <xsl:call-template name="string-replace-all"> 
    <xsl:with-param name="text" select="umbraco.library:NiceUrl($node/@id)"/> 
    <xsl:with-param name="replace" select="&apos;"/> 
    <xsl:with-param name="by" select="&amp;apos;"/> 
    </xsl:call-template> 
</loc> 

Le problème est &apos; est interprété par XSL en tant que '. &amp;apos; sera interprété comme &apos;.

+0

Merci - cela a fonctionné un charme –

+0

'select =" & apos; "' me donner une erreur de syntaxe: Jeton inattendu '&' dans l'expression. -> & <- apos; –

+0

Je reçois une erreur: le littéral de chaîne n'était pas fermé. -> '<- –

0

Avez-vous essayé d'installer disable-output-escaping yes pour votre xsl: value-of:

<xsl:value-of disable-output-escaping="yes" select="umbraco.library:NiceUrl($node/@id)"/> 

En fait, - ce qui est probablement le contraire de ce tu veux.

Que diriez-vous d'encapsuler le xsl: value-of dans un élément de texte xsl:?

<xsl:text><xsl:value-of select="umbraco.library:NiceUrl($node/@id)"/></xsl:text> 

Peut-être que vous devriez essayer de traduire '-&amp;apos;

+0

Merci J'essayées cela et aussi en combinaison avec la déclaration d'une variable appelée $ apos avec une valeur de 'et ensuite essayé d'utiliser une fonction de remplacement pour remplacer $ apos par' ' '- malheureusement XSLT interprète' ' 'comme' '' qui est une citation non fermée à nouveau - grrr –

1

La manière simple de supprimer les caractères indésirables de votre URL consiste à modifier les règles qu'utilise umbraco lors de la génération de NiceUrl.

Modifiez le fichier config/umbracoSettings.config

ajouter une règle pour supprimer tous les apostrophes de NiceUrls comme ceci:

<urlReplacing> 
    ... 
    <char org="'"></char>  <!-- replace ' with nothing --> 
    ... 
</urlReplacing> 

Note: Le contenu de l'attribut « org » est remplacé par le contenu de l'élément, voici un autre exemple:

<char org="+">plus</char> <!-- replace + with the word plus --> 
+0

Merci pour le conseil. J'ai donné un essai sur une boîte de dev local et j'ai trouvé un petit effet secondaire. Le remplacement s'applique uniquement aux noeuds publiés après le changement de configuration. Tous les nœuds existants avec ces caractères doivent être republiés - c'est un grand site compliqué avec beaucoup de liens - il faudrait ajouter des charges de règles de réécriture d'URL :( –

+0

vous pouvez 'republier le site entier' (clic droit sur le nœud racine dans l'arbre view) bien sûr, toutes les url bookmarked seront erronées, mais les liens internes devraient être mis à jour.Vous devrez peut-être faire une "republication HARD" si cela ne fonctionne pas – Myster

0

Cela fonctionne, il vous suffit de changer DEUX params comme indiqué ci-dessous

<xsl:with-param name="replace">&apos;</xsl:with-param> 
<xsl:with-param name="by" >AnyString</xsl:with-param> 
Questions connexes