1

我有一些 XML 格式的数据。例如:_

<?xml version="1.0"?>
<TableSizes>
   <Table name="AuditLog" rows="13193925" reserved="4896864" data="2522592" indexSize="2373824" unused="448"/>
   <Table name="Customers" rows="7021839" reserved="3243392" data="1480640" indexSize="1762640" unused="112"/>
</TableSizes>

我希望这些数据由客户转换和显示。因此,当我向用户代理提供 xml 时,我向它提供了一个样式表:

<?xml version="1.0"?>
<?xml-stylesheet type='text/xsl' href='databaseSize.xslt' media='all'?>
<TableSizes>
   <Table name="AuditLog" rows="13193925" reserved="4896864" data="2522592" indexSize="2373824" unused="448"/>
   <Table name="Customers" rows="7021839" reserved="3243392" data="1480640" indexSize="1762640" unused="112"/>
</TableSizes>

这会导致它被转换成一些合适的 HTML。这足够好。

但现在我想添加数据栏

就像现在一样,我一直在服务器上生成 HTML(即服务器决定如何显示内容,而不是样式表):

在此处输入图像描述

这需要每个表格单元格background应用自定义样式,并使用计算的渐变停止:

<TR>
    <TD>AuditLog
    <TD style="background: linear-gradient(to right, #658FC6 0%,rgb(255,255,255) 100%,rgb(255,255,255) 100%)">1319,,3925
    <TD style="background: linear-gradient(to right, #FF595E 0%,rgb(255,255,255) 100%,rgb(255,255,255) 100%)">489,,6864
    <TD>252,,2592
    <TD>237,,3824
    <TD>448
</TR>
<TR>
    <TD>Customers
    <TD style="background: linear-gradient(to right, #658FC6 0%,rgb(255,255,255) 51%,rgb(255,255,255) 100%)">702,,1839
    <TD style="background: linear-gradient(to right, #FF595E 0%,rgb(255,255,255) 62%,rgb(255,255,255) 100%)">324,,3392
    <TD>148,,0640
    <TD>176,,2640
    <TD>112
</TR>

显然,我宁愿通过样式表在客户端执行所有这些操作,而不是在服务器上执行。

可能的?

注意:如果不是:这不是问题;就这么说吧。

到目前为止我有什么 XSLT?

本质上,没有。到目前为止,我拥有的 XST 对添加数据栏没有任何作用:

<TD><xsl:value-of select="@name"/>
<TD><xsl:value-of select="@rows"/>
<TD><xsl:value-of select="@reserved"/>
<TD><xsl:value-of select="@data"/>
<TD><xsl:value-of select="@indexSize"/>
<TD><xsl:value-of select="@unused"/>

我添加了一个虚拟数量的渐变绘图代码:

<TD><xsl:value-of select="@name"/>
<TD style='background: linear-gradient(to right, #FF595E 0%,rgb(255,255,255) 50%,rgb(255,255,255) 100%)'><xsl:value-of select="@rows"/>
<TD style='background: linear-gradient(to right, #FF595E 0%,rgb(255,255,255) 50%,rgb(255,255,255) 100%)'><xsl:value-of select="@reserved"/>
<TD><xsl:value-of select="@data"/>
<TD><xsl:value-of select="@indexSize"/>
<TD><xsl:value-of select="@unused"/>

严格来说,我什至没有那个 XSLT。当它无法完成我想要的事情时,我不想编写整个 XSLT。我在上面的 XSLT 是我即时创建的,当时有人建议在我至少假装先有一些 XSLT 之前无法回答这个问题。

4

1 回答 1

0

您可以在 XSLT 中轻松地进行计算并将其放入样式属性中。

我为每个AuditLog和创建了一个模板Customers。然后在Customers模板中,我刚刚为之前的值定义了一个变量,AuditLog以便在计算中使用。从那里我用每个来计算渐变所需的百分比(以及一些快速的“四舍五入”)。

<xsl:value-of select="substring(((@rows div $PrevRow) * 100),1,2)"/>

因此,当您获取 XML 并使用此 XSL 对其进行转换时

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />

  <xsl:template match="Table[@name='AuditLog']">
    <tr>
      <td>
        <xsl:value-of select="@name"/>
      </td>
      <td style="background: linear-gradient(to right, #FF595E 0%,rgb(255,255,255) 100%,rgb(255,255,255) 100%)">
        <xsl:value-of select="@rows"/>
      </td>
      <td style="background: linear-gradient(to right, #FF595E 0%,rgb(255,255,255) 100%,rgb(255,255,255) 100%)">
        <xsl:value-of select="@reserved"/>
      </td>
      <td>
        <xsl:value-of select="@data"/>
      </td>
      <td>
        <xsl:value-of select="@indexSize"/>
      </td>
      <td>
        <xsl:value-of select="@unused"/>
      </td>
    </tr>
  </xsl:template>

  <xsl:template match="Table[@name='Customers']">
    <xsl:variable name="PrevRow" select="preceding-sibling::Table/@rows"/>
    <xsl:variable name="PrevReserved" select="preceding-sibling::Table/@reserved"/>
    <tr>
      <td>
        <xsl:value-of select="@name"/>
      </td>
      <td>
        <xsl:attribute name="style">
          <xsl:text>background: linear-gradient(to right, #FF595E 0%,rgb(255,255,255) </xsl:text>
          <xsl:value-of select="substring(((@rows div $PrevRow) * 100),1,2)"/>
          <xsl:text>%,rgb(255,255,255) 100%)</xsl:text>
        </xsl:attribute>
        <xsl:value-of select="@rows"/>
      </td>
      <td>
        <xsl:attribute name="style">
          <xsl:text>background: linear-gradient(to right, #FF595E 0%,rgb(255,255,255) </xsl:text>
          <xsl:value-of select="substring(((@reserved div $PrevReserved) * 100),1,2)"/>
          <xsl:text>%,rgb(255,255,255) 100%)</xsl:text>
        </xsl:attribute>
        <xsl:value-of select="@reserved"/>
        <br/>
        <xsl:value-of select="$PrevReserved"/>
      </td>
      <td>
        <xsl:value-of select="@data"/>
      </td>
      <td>
        <xsl:value-of select="@indexSize"/>
      </td>
      <td>
        <xsl:value-of select="@unused"/>
      </td>
    </tr>
  </xsl:template>

</xsl:stylesheet>

你得到这个输出:

<tr>
  <td>AuditLog</td>
  <td style="background: linear-gradient(to right, #FF595E 0%,rgb(255,255,255) 100%,rgb(255,255,255) 100%)">13193925</td>
  <td style="background: linear-gradient(to right, #FF595E 0%,rgb(255,255,255) 100%,rgb(255,255,255) 100%)">4896864</td>
  <td>2522592</td>
  <td>2373824</td>
  <td>448</td>
</tr>
<tr>
  <td>Customers</td>
  <td style="background: linear-gradient(to right, #FF595E 0%,rgb(255,255,255) 53%,rgb(255,255,255) 100%)">7021839</td>
  <td style="background: linear-gradient(to right, #FF595E 0%,rgb(255,255,255) 66%,rgb(255,255,255) 100%)">3243392<br/>4896864</td>
  <td>1480640</td>
  <td>1762640</td>
  <td>112</td>
</tr>
于 2013-09-25T21:29:49.977 回答