【问题标题】:Javascript with xlt formatting error带有 xlt 格式错误的 Javascript
【发布时间】:2012-10-06 17:39:58
【问题描述】:

我正在使用 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;
}

【问题讨论】:

  • 不是答案,但您可以在不使用扩展功能的情况下使用 format-number($value, substring('0000000000000000000000', 1, $length)) 执行此操作(如果需要,添加更多零)

标签: javascript xslt formatting padding transformation


【解决方案1】:

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

return "" + pd;

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案3】:

      @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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多