2009-09-03 9 views
2

Dans mon application Web, j'affiche les résultats de la recherche en utilisant XSLT. Il y a du texte codé en dur dans le fichier XSLT que je veux rendre indépendant de la langue.Rendre le langage XSLT indépendant

XSLT:

<xsl:if test="$IsEmpty"> 
    <table cellpadding="5" cellspacing="0" border="1" style="width:100%;border-top-style:solid;border-bottom-style:solid;border-left-style:solid;border-right-style:solid;border-top-color:gray;border-bottom-color:gray;border-left-color:gray;border-right-color:gray;border-top-width:1px;border-bottom-width:1px;border-left-width:1px;border-right-width:1px;"> 
     <tr> 
      <td style="text-align:center;"> 
       There are no blog posts to display. 
      </td> 
     </tr> 
    </table> 
</xsl:if> 

Est-il possible de choisir le texte "There are no blog posts to display." à partir d'un fichier de ressources?

Répondre

6

Je suppose que par "fichier de ressources" vous voulez dire un resx régulier qui est compilé dans l'ensemble. Dans ce cas, pas directement de xslt; Cependant, vous pouvez ajouter un objet d'extension et d'utiliser une approche clé de base, à savoir

<xsl:value-of select="resx:getString('noposts')"/> 

L'alias « resx » serait mis en correspondance (xmlns) à un uri que vous utilisez lors de la création de votre wrapper xslt en C#. Par exemple, avec le xmlns (dans le préambule de xslt):

xmlns:resx="myextnuri" 

nous pouvons mapper en C# via:

public class MyXsltExtension { 
    public string getString(string key) { 
     return "TODO: Read from resx: " + key; 
    } 
} 

et le joindre à l'espace de noms:

XslCompiledTransform xslt = new XslCompiledTransform(); 
xslt.Load("xslt.xslt"); 
XsltArgumentList args = new XsltArgumentList(); 
object obj = new MyXsltExtension(); 
args.AddExtensionObject("myextnuri", obj); 
using (XmlWriter writer = XmlWriter.Create("out.xml")) { 
    xslt.Transform("xml.xml", args, writer); 
} 

Nous maintenant avoir le plein contrôle pour injecter du code managé (en tant qu'extensions) dans notre xslt.

+0

Une grande aide. Ça a marché! Merci! – Vijay

+0

'msxsl: script' est encore une autre option. –

+0

Je ne vois pas comment 'msxsl: script' donnerait accès à resx; J'aimerais voir un exemple ... –

2

Vous pouvez charger des ressources à partir d'un fichier externe en utilisant la fonction document():

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="yes"/> 

    <xsl:template match="@* | node()"> 
     <html> 
     <head> 
      <title>Test</title> 
     </head> 
     <body> 
      <p> 
      <xsl:value-of select="document('resources.xml')/items/item[@id = 'no_posts']"/> 
      </p> 
     </body> 
     </html> 
    </xsl:template> 

XML fichier de ressources:

<?xml version="1.0" encoding="utf-8"?> 
<items> 
    <item id="no_posts">There are no blog posts to display.</item> 
</items> 
</xsl:stylesheet> 
Questions connexes