2

我有这个使用 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">
4

2 回答 2

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。

于 2012-11-08T22:57:06.773 回答
3

我得到了一个与破折号非常相似的解决方案,只是我使用了带有格式说明符“0”的 format-number() 而不是 concat()。

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

它在 VS2010 中对我有用。

于 2012-11-08T23:04:39.003 回答