猿问

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

问题

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

背景

编辑: 这是一个使用 ASP.NET Core 作为审核外部资源运行状况的长期运行服务的主机来运行的 BackgroundService 实现。这可能是 .NET Core 缺乏 .NET Framework 中存在的一些功能的问题,所以我认为值得一提

这个想法的开始是因为我正在寻找一种方法来制作一个简单的 HTML 模板,我的 C# 数据对象可以以一种简单而有效的方式映射到该模板,而无需操作 StringBuilder。怀着这样的希望,我找到了这个 StackOverflow 响应,它说 XSLT 将是一个很好的解决方案,而无需采用完整的 MVC 方法。

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

<?xml version="1.0" encoding="utf-8" ?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:output method="html" encoding="utf-8"/>

  <xsl:template match='/Email'>

    <html>

      <head>

        <style>

          <xsl:value-of select="Styles"/>

        </style>

      </head>

      <body>

        <h1>Total</h1>

        <table id="tblTotal" class="clsPositive">

          <tr>

            <th>Audit Date</th>

            <th>Source 1</th>

            <th>Source 2</th>

            ...

          </tr>

          <xsl:for-each select="Total/ArrayOfElement/AuditElement">

            <xsl:sort select="ReportDate" order="descending"/>

            <tr>

              <td><xsl:value-of select="ReportDate"/></td>

              <td><xsl:value-of select="Source1CountFormatted"/> (<xsl:value-of select="Source1GrowthFormatted"/>)</td>

              <td><xsl:value-of select="Source2CountFormatted"/> (<xsl:value-of select="Source2GrowthFormatted"/>)</td>

              ...

            </tr>

          </xsl:for-each>

        </table>

      </body>

    </html>

  </xsl:template>

</xsl:stylesheet>

有了这个,我有了一个想法,根据所表示的数据类型有条件地格式化增长百分比(您可以通过表上的类属性看到它的开头,我用它来确定增加或减少是否为正或消极的)。然而,当我尝试执行此操作时,Visual Studio 告诉我 XSL 格式错误:


<td><xsl:value-of select="Source1CountFormatted"/> (<i class="<xsl:value-of select="Source1GrowthCss"/>"><xsl:value-of select="Source1GrowthFormatted"/> </i>)</td>

郎朗坤
浏览 107回答 1
1回答

汪汪一只猫

这里的语法是错误的:<i class="<xsl:value-of select="Source1GrowthCss"/>">要动态设置属性的值,您可以使用xsl:attribute,如下所示:<i>&nbsp; &nbsp;<xsl:attribute name="class">&nbsp; &nbsp; &nbsp; <xsl:value-of select="Source1GrowthCss"/>&nbsp; &nbsp;</xsl:attribute></i>但这是相当啰嗦的。理想的方法是使用“属性值模板”,它更清晰<i class="{Source1GrowthCss}">这里,大括号表示要计算表达式,而不是按字面输出。
随时随地看视频慕课网APP
我要回答