Установка параметров подстановки XSL в коде c # - PullRequest
0 голосов
/ 31 октября 2009

Я пытаюсь установить переменные ширины <WIDTH> и <WIDTH1> в XSL, которые я получаю из web.config в c #, как показано ниже:

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

cslx.Xslt=@"<?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); 

Но HTML не генерируется и выдается ошибка относительно тега таблицы, который не закрыт.

Я знаю, что тег table должен находиться внутри каждого тега xsl: when и xsl: else, но я хочу этого избежать.

Моя проблема в том, что между тегами много XSL-кода, и я хочу избежать дублирования кода! Есть ли другой способ, которым я могу достичь этого?

Большое спасибо,

Ответы [ 2 ]

3 голосов
/ 31 октября 2009
  1. Используйте XSLT-параметры для передачи параметров в таблицу стилей, а не замена строки.
  2. Ваш XSLT не является правильно сформированным XML-документом. к манипулировать атрибутами, вы должны использовать ваши xsl:when внутри xsl:attribute элемент. В вашем случае ваш код должен быть таким:

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

cslx.Xslt=@"<?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 голосов
/ 31 октября 2009

Ваш XSL не является правильно сформированным XML, например:

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

Первое, что вы должны сделать, - это сконцентрироваться на правильной настройке XSLT. Обратите внимание, что у вас должно быть xsd:choice элементов, обертывающих xsl:otherwise и т. Д. Существует много других ошибок (например, xsl:when=... должно быть xsl:when test="...). Сделай это постепенно:

  1. научиться писать XML
  2. Learn XSLT
  3. Только потом поместите его в C #
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...