2

我正在使用 javascript 在我的 xslt 文件中填充数字。但是在调试时我收到一条错误消息。

不支持具有 Clr 类型“ConcatString”的扩展函数参数或返回值。

我怎样才能解决这个问题?

xslt

<xsl:template name="padNumber">
    <xsl:param name="value"></xsl:param>
    <xsl:param name="length"></xsl:param>
    <xsl:value-of select="user:PadDigits($value,$length)"/>
  </xsl:template>

javascript

function PadDigits(n, totalDigits)
{
    n = n.toString();
    var pd = '';
    if (totalDigits &gt; n.length)
    {
        var i;
        for (i=0; i&lt;(totalDigits-n.length); i++)
        {
            pd += '0';
        }
    }
    pd = pd + n.toString();
    return pd;
}
4

3 回答 3

3

更改您的 PadDigits 以返回字符串:

return "" + pd;
于 2012-10-16T15:23:45.320 回答
2

您根本不需要扩展功能。

使用这个纯 XSLT 实现

 <xsl:template name="padNumber">
    <xsl:param name="pValue"/>
    <xsl:param name="pLength"/>

    <xsl:value-of select=
    "concat(substring(substring($vZeroes,1,$pLength),
                      string-length($pValue) +1),
            $pValue)
    "/>
  </xsl:template>

这是一个完整的例子

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

 <xsl:variable name="vZeroes" select=
  "'000000000000000000000000000000000000000'"/>

 <xsl:template match="/">
  <xsl:call-template name="padNumber">
    <xsl:with-param name="pValue" select="12345"/>
    <xsl:with-param name="pLength" select="8"/>
  </xsl:call-template>
 </xsl:template>

 <xsl:template name="padNumber">
    <xsl:param name="pValue"/>
    <xsl:param name="pLength"/>

    <xsl:value-of select=
    "concat(substring(substring($vZeroes,1,$pLength),
                      string-length($pValue) +1),
            $pValue)
    "/>
  </xsl:template>
</xsl:stylesheet>

当将此转换应用于任何 XML 文档(本演示中未使用)时,将产生所需的正确结果

00012345

您可以进一步参数化要使用的所需填充字符:

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

 <xsl:variable name="vZeroes" select=
  "'000000000000000000000000000000000000000'"/>

 <xsl:template match="/">
  <xsl:call-template name="padNumber">
    <xsl:with-param name="pValue" select="12345"/>
    <xsl:with-param name="pLength" select="8"/>
    <xsl:with-param name="pPadChar" select="'*'"/>
  </xsl:call-template>
 </xsl:template>

 <xsl:template name="padNumber">
    <xsl:param name="pValue"/>
    <xsl:param name="pLength"/>
    <xsl:param name="pPadChar" select="'0'"/>

    <xsl:variable name="vZeroes" select="translate($vZeroes, '0', $pPadChar)"/>

    <xsl:value-of select=
    "concat(substring(substring($vZeroes,1,$pLength),
                      string-length($pValue) +1),
            $pValue)
    "/>
  </xsl:template>
</xsl:stylesheet>

执行此转换时,现在的结果是:

***12345
于 2012-10-16T15:26:33.120 回答
0

@RoManiac 谢谢帮助。我发现我更喜欢这个模板,以防万一有人来看看。

<xsl:template name="format-batchnum">
    <xsl:param name="batchnum"/>
    <xsl:param name="numbatchdigit" select="12"/>

    <xsl:choose>
      <xsl:when test="string-length($batchnum)>=$numbatchdigit">
        <xsl:value-of select="$batchnum"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:text>0</xsl:text>
        <xsl:call-template name="format-batchnum">
          <xsl:with-param name="batchnum" select="$batchnum"/>
          <xsl:with-param name="numbatchdigit" select="$numbatchdigit -1"/>
        </xsl:call-template>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
于 2012-10-16T15:27:00.147 回答