在c#代码中设置XSL替换参数

时间:2009-10-31 15:00:39

标签: c# .net xml xslt

我正在尝试在XSL中设置宽度变量 <WIDTH> <WIDTH1> ,我正在从c#中的web.config中恢复下面:

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:otherwise标签,但我想避免这种情况。

我的问题是标签之间有很多XSL代码,我想避免代码重复!还有其他方法可以实现这个目标吗?

非常感谢,

2 个答案:

答案 0 :(得分:3)

  1. 使用XSLT parameters将参数传递给样式表,而不是 字符串替换。
  2. 您的XSLT不是格式良好的XML文档。至 操纵属性,你必须使用你的xsl:when xsl:attribute元素。在您的情况下,您的代码应该是这样的:

  3. 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);
    

答案 1 :(得分:0)

您的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. 学习XSLT
  3. 只有将它放入C#