XSL中的格式化和计算

时间:2012-11-08 22:36:48

标签: xml math xslt format

我有这个使用XSL的DataView。一列是链接。我正在使用的字段作为查询字符串键{@Title}需要为链接进行更改。

  • 目前有9个数字,我需要删除第一个数字。
  • 剩余的8个数字需要多被8个
  • 多个

所以N00000010变为00000080

以下代码只是输出

https://myserver.edu/zzz/r.aspx?key=N00000010

但应该是

https://myserver.edu/zzz/r.aspx?key=00000080

更新:如果溢出,如果需要,输出可以超过8位,实际上,这是可以接受的,甚至更可取。

https://myserver.edu/zzz/r.aspx?key=80

    <td class="ms-vb">
            <xsl:value-of select="@Supervisor" /></td><td class="ms-vb">
            <xsl:value-of select="format-number(@StartingSickBalance, '#,##0.00;-#,##0.00')" /></td><td class="ms-vb">
            <xsl:value-of select="format-number(@FiscalStartingBalance, '#,##0.00;-#,##0.00')" /></td><td class="ms-vb">
            <a href="https://myserver.edu/zzz/r.aspx?key={@Title}">See Balances</a>
            </td><td class="ms-vb">

2 个答案:

答案 0 :(得分:3)

<强>更新

如果不需要使用前导0限制输出,则以下内容应该起作用:

  <xsl:variable name="linkId" select="number(substring({@Title}, 2,8)) * 8" />
  <a href="https://myserver.edu/zzz/r.aspx?key={$linkId}">Test</a>

或者,正如@DevNull所提到的,没有变量:

<a href="https://myserver.edu/zzz/r.aspx?key={number(substring(@Title, 2,8)) * 8}">Test</a>

这将产生输出:

<a href="https://myserver.edu/zzz/r.aspx?key=80">Test</a>

早期答案

执行此操作的一种方法是将原始字符串子串以删除前导字母:

substring({@Title}, 2, 8)

这给了我们:00000010

然后我们在前面放置一个1以保持前导0:

concat(1, substring({@Title}, 2, 8))

给予:100000010

然后我们可以转换为数字并将其乘以8:

number(concat(1, substring({@Title}, 2, 8))) * 8

给予800000080

然后再次子串:

substring(number(concat(1, substring({@Title}, 2, 8))) * 8, 2, 8)

给予:00000080

全部放在一起:

<xsl:value-of select="substring(number(concat(1, substring({@Title}, 2, 8))) * 8, 2, 8)" />

在输出中使用它:

  <xsl:variable name="linkId" select="substring(number(concat(1, substring({@Title}, 2, 8))) * 8, 2, 8)" />
  <a href="https://myserver.edu/zzz/r.aspx?key={$linkId}">Test</a>
似乎有点长啰嗦,但有效。我无法让format-number在我的xsl解析器(C#,。Net 4.0)中保持前导零值

如果format-number适用于您,则以下内容更为优雅:

  <xsl:variable name="linkId" select="format-number(number(concat(1, substring({@Title}, 2, 8))) * 8, '00000000')" />
  <a href="https://myserver.edu/zzz/r.aspx?key={$linkId}">Test</a>

然而,正如@MvG指出的那样,如果乘以8溢出原始的8位数,则8位数可能变为9位。

答案 1 :(得分:3)

我找到了一个非常类似于dash的解决方案,只是我使用格式说明符'0'而不是concat()的format-number()。

<xsl:value-of select="format-number(number(substring({@Title}, 2,8))*8, '00000000')" />

在VS2010中它对我有用。