2009-09-15 4 views
2

Je dois déterminer la meilleure façon de convertir les chaînes de caractères locales en un nom convivial. Je pourrais écrire un grand <xsl:choose> et ajouter juste une condition pour chacun des endroits que je veux convertir, mais je pense qu'il y a probablement un moyen plus efficace ou intelligent.Convertir les paramètres régionaux en langue/pays à l'aide de XSL

Mon entrée ressemble à ceci:

<content name="locale" value="en_US" /> 
<content name="locale" value="ja_JP" /> 

Et la sortie correspondante pourrait ressembler à ceci:

<content name="language" value="English" /> 
<content name="language" value="Japanese" /> 

Dans mon cas, je ne me soucie pas du pays en ce moment, seule la langue. Je n'ai pas non plus besoin de vérifier toutes les locales possibles, seulement 10 ou plus actuellement, mais il y en aura peut-être plus dans le futur, c'est pourquoi je cherche le moyen le moins rigide de traiter la conversion.

+0

Grande question! Cela me donne quelques idées moi-même ... – Brabster

Répondre

2

Vous pouvez stocker le mappage dans un autre fichier XML et y accéder à l'aide de la fonction document() à partir de votre feuille de style. En supposant que vous avez un fichier de mappage comme celui suggéré par Chris McCall dans son answer, vous pouvez le faire comme ceci:

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:variable name="mapping" 
       select="document('mapping.xml')"/> 

    <xsl:template match="content[@name='locale']"> 
    <xsl:variable name="locale" select="@value"/> 
    <content name="language"> 
     <xsl:attribute name="value"> 
     <xsl:value-of 
      select="$mapping//content-map[@locale=$locale]/@language"/> 
     </xsl:attribute> 
    </content> 
    </xsl:template> 

</xsl:stylesheet> 

Si vous voulez une solution vraiment compacte, vous pouvez même inclure la cartographie dans le stylesheet lui-même . Étant donné que les processeurs XSLT doivent ignorer tous les éléments qui ne proviennent pas de l'espace de noms XSLT de l'élément xsl:stylesheet, vous pouvez y inclure le mappage. Vous pouvez accéder au document XSLT lui-même en tant que document('').

Ainsi, la feuille de style autonome avec une cartographie pourrait ressembler à ceci:

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:map="https://stackoverflow.com/questions/1428947#" 
       exclude-result-prefixes="map" 
       > 

    <map:mapping> 
    <map:content-map locale="en_US" language="English"/> 
    <map:content-map locale="ja_JP" language="Japanese"/> 
    </map:mapping> 

    <xsl:variable name="mapping" 
       select="document('')//map:mapping"/> 

    <xsl:template match="content[@name='locale']"> 
    <xsl:variable name="locale" select="@value"/> 
    <content name="language"> 
     <xsl:attribute name="value"> 
     <xsl:value-of 
      select="$mapping//map:content-map[@locale=$locale]/@language"/> 
     </xsl:attribute> 
    </content> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Serait-il possible de stocker le mapping dans un plutôt qu'un document externe? L'application dans laquelle je travaille ne me permet pas de référencer des fichiers externes - tout le traitement XML est fait en interne et je ne peux écrire que des 's, fondamentalement. –

+0

Quel processeur XSLT votre application utilise-t-elle? Supporte-t-il XSLT version 1 ou version 2? Il est possible de stocker le mapping dans une variable en utilisant XML, mais si vous voulez accéder à la valeur avec XPath, vous devez avoir un processeur XSLT 2 ou un processeur XSLT 1 qui supporte la fonction d'extension 'node-set' (beaucoup les processeurs le supportent): http://www.xml.com/pub/a/2003/07/16/nodeset.html –

+0

J'essaie de comprendre les contraintes. Vous pouvez donc ajouter des éléments 'xsl: template' dans l'élément' xsl: stylesheet', mais vous ne pouvez pas ajouter d'autres éléments de haut niveau, n'est-ce pas? La fonction 'document()' est-elle disponible?Tant que 'document ('')' fonctionne et vous donne accès à la feuille de style elle-même, vous pouvez utiliser l'approche dans la deuxième solution, mais simplement placer le mapping dans un élément 'xsl: variable' dans un modèle. Le contenu supplémentaire ne doit pas nécessairement être un élément de niveau supérieur, il peut être n'importe où dans la feuille de style. –

1

Question intéressante!

Que diriez-vous d'un fichier de mappage XML intermédiaire ?:

<content-maps> 
<content-map locale="en_US" language="English"/> 
<content-map locale="ja_JP" language="Japanese"/> 
</content-maps> 

Utilisez pour créer votre XSL bloc <xsl:choose> de cela et exécuter les résultats sur votre fichier d'entrée.

0

Il y a probablement un meilleur moyen, mais vous pourriez avoir les recherches de pays bien formatées dans un document XML séparé, puis référencer et compresser ces informations dans votre sortie. Cela permettrait au moins de tenir à distance la grosse déclaration de choix et de vous donner des options d'expansion futures.

Questions connexes