C# 如何在XSLT中嵌套元素以实现条件样式?

C# 如何在XSLT中嵌套元素以实现条件样式?,c#,asp.net-core,xslt,C#,Asp.net Core,Xslt,问题 如何利用XSL提供由运行的代码决定的条件格式(例如,表行之间的增加或减少) 背景 编辑:这是一个BackgroundService实现,它使用ASP.NET Core作为主机运行,用于审计外部资源的运行状况。这可能是由于.NET核心缺少.NET框架中的一些功能,因此我认为值得一提 这个想法之所以产生,是因为我在寻找一种方法来制作一个简单的HTML模板,我的C#数据对象可以以一种简单高效的方式映射到该模板,而不需要操纵StringBuilder。出于这种希望,我发现XSLT将是一个伟大的解决

问题

如何利用XSL提供由运行的代码决定的条件格式(例如,表行之间的增加或减少)

背景

编辑:这是一个BackgroundService实现,它使用ASP.NET Core作为主机运行,用于审计外部资源的运行状况。这可能是由于.NET核心缺少.NET框架中的一些功能,因此我认为值得一提

这个想法之所以产生,是因为我在寻找一种方法来制作一个简单的HTML模板,我的C#数据对象可以以一种简单高效的方式映射到该模板,而不需要操纵StringBuilder。出于这种希望,我发现XSLT将是一个伟大的解决方案,而不必采用完整的MVC方法

这里是一切开始的地方(为简洁起见进行了删节):


全部的
审计日期
资料来源1
资料来源2
...
()
()
...
有了这个,我有了一个想法,根据所表示的数据类型有条件地格式化增长百分比(您可以通过表上的class属性看到它的开头,我用它来确定增加或减少是正还是负)。但是,当我尝试这样做时,Visual Studio告诉我XSL的格式不正确:

<td><xsl:value-of select="Source1CountFormatted"/> (<i class="<xsl:value-of select="Source1GrowthCss"/>"><xsl:value-of select="Source1GrowthFormatted"/> </i>)</td>
()
我还尝试了一种方法,“…GrowthFormatted”属性将返回它的内联样式,但在解析到要转换的XML树时,所有HTML都会立即转义。在此之前,我的最后一次尝试是使用xsl:text方法,禁用输出转义:“yes”。这导致了XSL的这种畸形(请注意两种不同的方法,看看它是否能工作):

(i class=”“/i)
(i class=”“/i)
你们当中目光锐利的人可能会注意到我使用了of
提供的教科书示例,你可能会问,结果是什么?好吧,Visual Studio没有错,因为嵌套元素不能与XSL很好地协同工作,并引发了以下异常:

XslLoadException: XSLT compile error. An error occurred at , (66, 84). ---> System.Xml.XmlException: '<', hexadecimal value 0x3C is an invalid attribute character. Line 66, poisition 84.

xsloadexception:XSLT编译错误。在(66,84)处发生错误。-->System.Xml.XmlException:“此处的语法错误:

<i class="<xsl:value-of select="Source1GrowthCss"/>">
但这是相当冗长的。理想的方法是使用“属性值模板”,这更干净

<i class="{Source1GrowthCss}">

这里,大括号表示要对表达式求值,而不是逐字输出

  ...
  <tr>
    <td>2019-09-19 12:30:40Z</td>
    <td>35,991,744 (&lt;i class="clsDecrease"&gt;0.00%&lt;/i&gt;)</td>
    <td>755,412 (&lt;i class="clsDecrease"&gt;0.00%&lt;/i&gt;)</td>
  ...
<i class="<xsl:value-of select="Source1GrowthCss"/>">
<i>
   <xsl:attribute name="class">
      <xsl:value-of select="Source1GrowthCss"/>
   </xsl:attribute>
</i>
<i class="{Source1GrowthCss}">