2009-09-22 9 views
0

Dans XSLT 2.0, existe-t-il un moyen facile de remplacer les espaces réservés nommés dans une chaîne?Suppléments de chaîne XSLT

Je pense à quelque chose comme string.Template Python, où vous pouvez le faire:

d = dict(name='Joe', age='50') 
print Template("My name is $name and my age is $age").substitute(d) 

Le point est d'extérioriser la chaîne, il peut donc être facilement changé. Le seul moyen que j'ai trouvé jusqu'ici est d'utiliser un template nommé xsl: avec des paramètres, mais c'est assez verbeux. Y a-t-il un moyen plus facile?

+0

Votre question n'est pas claire. Voulez-vous un mécanisme automatisé qui recherchera des jetons sous la forme, par exemple, $ name, lookup "nom" dans une table de valeurs de substitution et remplacera $ name par la valeur? Dans des nœuds de texte spécifiques? Globalement? –

+0

Je cherche quelque chose que je peux appeler, en lui passant une chaîne spécifique et un ensemble de paramètres. –

Répondre

1

J'ai fini par faire quelque chose comme ceci:

<!-- Reusable template to perform substitutions on a string --> 
<xsl:template name="substitutions"> 
    <!-- "string" is a string with placeholders surrounded by {} --> 
    <xsl:param name="string" /> 
    <!-- "subs" is a list of nodes whose "key" attributes are the placeholders --> 
    <xsl:param name="subs" /> 
    <xsl:analyze-string select="$string" regex="\{{(.*?)\}}"> 
     <xsl:matching-substring> 
      <xsl:value-of select="$subs/sub[@key=regex-group(1)]" /> 
     </xsl:matching-substring> 
     <xsl:non-matching-substring> 
      <xsl:value-of select="." /> 
     </xsl:non-matching-substring> 
    </xsl:analyze-string> 
</xsl:template> 

<!-- Example use of template --> 
<xsl:variable name="nameStr">My name is {name} and my age is {age}</xsl:variable> 
<xsl:call-template name="substitutions"> 
    <xsl:with-param name="string" select="$nameStr" /> 
    <xsl:with-param name="subs"> 
     <sub key="name">Joe</sub> 
     <sub key="age">50</sub> 
    </xsl:with-param> 
</xsl:call-template> 

je devais utiliser des attributs pour les noms de substitution, plutôt que de simplement passer des noeuds avec des noms différents (par exemple <nom> Joe </nom >). XPath (ou du moins Saxon, le processeur que j'utilise) ne semble pas autoriser les expressions dynamiques comme "$ subs/regex-group (1)". Mais cela permet "$ subs/sub [@ key = regex-group (1)]".

1

Il n'existe pas de fonctionnalité de haut niveau dans l'ordre des modèles de chaînes Python, mais vous pouvez faire quelque chose de similaire en utilisant xsl: analyse-string, qui vous permettra de traiter une analyse regex d'une chaîne à la fois . Si vous souhaitez que les remplacements soient pilotés par des tables, vous pouvez définir une clé xsl: pour stocker le mappage et écrire une fonction xsl: pour effectuer le remplacement sur une chaîne arbitraire.

Pas la chose la plus facile au monde, mais certainement faisable et réutilisable plus tard si c'est fait correctement.

+0

Bonne idée d'utiliser analyse-chaîne - voir ma solution, posté comme une réponse séparée. –