2010-10-29 4 views
2

J'ai un document XML qui ressemble à ceci.XSL: translate() avec html dans la chaîne de remplacement

<?xml version="1.0"?> 
<services> 
    <service sn="1" family="2 Week Wait"> 
    <service_name>2 Week Wait Dermatology</service_name> 
    <speciality>2 Week Wait</speciality> 
    <clinic_types>2 Week Wait Skin</clinic_types> 
    <tag>Malignant neoplasm of skin , Pigmented skin lesion </tag> 
</service> 

J'ai réussi à obtenir tout ce que je veux, mais pour un dernier coup sec, je voudrais avoir les Comma Separated affichent sous la forme d'une liste non ordonnée.

J'utilise cette ligne de sortie XSL pour la liste,

<ul> 
    <li> 
      <xsl:value-of select="translate(tag,',','<![CDATA[</li><li>]]>')" disable-output-escaping="yes" /> 
    </li> 
<ul> 

Je reçois une erreur disant que le fichier XML résultant est pas formaté correctement. J'ai essayé de remplacer la section de remplacement par d'autres trucs et ça a marché. J'ai également essayé d'utiliser les codes HTML ASCII pour les balises sans chance, donc je suis vraiment confus avec ce que je fais mal.

Toute aide appréciée, Merci

+0

duplication possible de [Est-ce que xslt a split() fonction?] (Http://stackoverflow.com/questions/3336424/does-xslt-have-split-function) ou http://stackoverflow.com/questions/584082/ xslt-best-way-à-split-and-render-virgule-séparé-text-as-html ou http://stackoverflow.com/questions/136500/does-xslt-have-a-split-function. En plus de la fausse approche avec 'fn: traslate()': il remplace un à un seul caractère. –

+0

J'ai réussi à obtenir ma solution via le premier lien, merci beaucoup. Je suis nouveau à XSL donc c'est une erreur de débutant –

Répondre

3

XSLT est XML; l'expression select est incorporée dans une valeur d'attribut, de sorte qu'elle doit appliquer une autre séquence d'échappement XML. Étant donné qu'une section CDATA ne peut pas vivre dans une valeur d'attribut, qui doit être appliqué manuellement:

<xsl:value-of select="translate(tag,',','&lt;/li>&lt;li>')" disable-output-escaping="yes" /> 

Cependant, l'application disable-output-escaping à la sortie de translate est discutable: si le texte avait < ou & caractères dans ce ? Vous transformeriez le contenu du texte en balisage actif, avec des problèmes de validité et de sécurité potentiels.

Normalement, il serait préférable d'ajouter le balisage de XSLT lui-même. Vous pouvez diviser une chaîne en XSLT 2.0 en utilisant la fonction tokenize: (. Si vous utilisez XSLT 1.0 doit être fait comme un modèle récursif en utilisant substring_before/after, qui est une douleur)

<ul> 
    <xsl:for-each select="tokenize(tag,',')"> 
     <li><xsl:value-of select="."/></li> 
    </xsl:for-each> 
</ul> 

+0

'tokenize' n'est pas une fonction XSLT ou XPath valide .--> tokenize (tag, ',') <- –

+0

oups envoyé trop tôt, ouais il me semble que je dois faire la chose du modèle récursif. –

+0

Honte! Voir [cette réponse] (http://stackoverflow.com/questions/136500/does-xslt-have-a-split-function/141022#141022) pour un exemple de la façon dont cela est fait. – bobince

Questions connexes