2009-10-31 9 views
0

Je suis en train de définir les variables de largeur <WIDTH> et <WIDTH1> au sein XSL que je retriveing ​​du web.config dans les C# comme ci-dessous:Réglage des paramètres de substitution XSL dans C# Code

string Width1 = System.Configuration.ConfigurationSettings.AppSettings.Get("Width1"); 
string Width2 = System.Configuration.ConfigurationSettings.AppSettings.Get("Width2"); 

[email protected]"<?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'/> 
<xsl:template match='/'> 
    <link rel='stylesheet' type='text/css' href='/StyleSheets/test.css'/> 
    <xsl:apply-templates select='/Data/Test/TestItems/TestItem'/> 
</xsl:template> 
<xsl:template match='TestItem'> 
    <xsl:when='boolean($Link1Items)or boolean($Link2Items) or boolean($Link3Items)'> 
    <table width='<WIDTH1>' class='tablestyle '> 
    </xsl:when> 
    <xsl:otherwise> 
    <table width='<WIDTH2>' class='tablestyle '> 
    </xsl:otherwise> 
    </table> 
</xsl:template> 
</xsl:stylesheet> 
"; 

// update subsitution parameters 
cslx.Xslt = cslx.Xslt.Replace("<WIDTH1>", Width1); 
cslx.Xslt = cslx.Xslt.Replace("<WIDTH2>", Width2); 

Mais la Le code HTML n'est pas généré et une erreur est renvoyée concernant la balise de table qui n'est pas fermée.

Je sais que la balise de table doit aller à l'intérieur de chaque balise xsl: when et xsl: sinon je veux éviter cela.

Mon problème est qu'il y a beaucoup de code XSL entre les tags et je veux éviter la duplication de code! Y a-t-il un autre moyen d'y parvenir?

Merci beaucoup,

Répondre

3
  1. Utilisez XSLT parameters pour passer des paramètres à votre feuille de style, pas chaîne remplacement.
  2. Votre fichier XSLT n'est pas un document XML bien formé. Pour manipuler les attributs, vous devez utiliser votre xsl:when s à l'intérieur d'un élément xsl:attribute. Dans votre cas, votre code devrait ressembler à ceci:

string Width1 = System.Configuration.ConfigurationSettings.AppSettings.Get("Width1"); 
string Width2 = System.Configuration.ConfigurationSettings.AppSettings.Get("Width2"); 

[email protected]"<?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'/> 
<xsl:param name='width1' /> 
<xsl:param name='width2' /> 
<xsl:template match='/'> 
    <link rel='stylesheet' type='text/css' href='/StyleSheets/test.css'/> 
    <xsl:apply-templates select='/Data/Test/TestItems/TestItem'/> 
</xsl:template> 
<xsl:template match='TestItem'> 
    <table class='tablestyle'> 
     <xsl:attribute name='width'> 
     <xsl:choose> 
     <xsl:when test='boolean($Link1Items)or boolean($Link2Items) or boolean($Link3Items)'><xsl:value-of select='$width1' /></xsl:when> 
     <xsl:otherwise><xsl:value-of select='$width2' /></xsl:otherwise> 
     </xsl:choose> 
     </xsl:attribute> 
    </table> 
</xsl:template> 
</xsl:stylesheet> 
"; 

var xslt = new XslCompiledTransform(); 
xslt.Load(new XmlTextReader(new StringReader(cslx.Xslt))); 

var args = new XsltArgumentList(); 
args.AddParam("width1", "", Width1); 
args.AddParam("width2", "", Width2); 

// whenever you want to transform 
var writer = new XmlWriter("output.xml"); 
xslt.Transform(document, args, writer); 
+0

Notez que même cela est mal formé - voir xsl: when construction –

+0

Oui, je l'avais recopié son en ligne, fixé maintenant, Merci. –

+0

La façon de résoudre le problème consiste à utiliser des paramètres. Si vous utilisez XSLT - je serais beaucoup plus heureux avec le XSLT dans son propre fichier (Visual Studio vous permet de déboguer les transformations XSLT de XML). – Murph

0

Votre XSL n'est pas bien formé XML, par exemple .:

<xsl:otherwise> 
    <table width='<WIDTH2>' class='tablestyle '> 
    </xsl:otherwise> 
    </table> 

La première chose que vous devez faire est de se concentrer sur l'obtention de la XSLT correcte. Notez que vous devez avoir xsd:choice éléments enveloppant le xsl:otherwise, etc. Il y a beaucoup d'autres erreurs (par exemple xsl:when=... devrait être xsl:when test="...). Prenez-le dans les étapes:

  1. apprendre comment écrire XML
  2. En savoir XSLT
  3. mettre seulement ensuite en C#
Questions connexes