0

我在 XSLT 2.0 中编写了一段将二进制转换为十进制的代码,并且被困在将结果的每个数学幂值相加的过程中。请帮忙。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" extension-element-prefixes="xs">

  <xsl:template match="SUBSCRIBER">

    <xsl:variable name="binary" select="'0101'"/>

    <xsl:for-each select="for $i in 1 to string-length($binary) return $i">

      <xsl:variable name="powerVal">
        <xsl:call-template name="mathpower">
          <xsl:with-param name="base" select="2"/>
          <xsl:with-param name="power" select="(string-length($binary)-.)"/>
        </xsl:call-template>
      </xsl:variable>
      <xsl:value-of select="number(substring($binary,.,1))*number($powerVal)"/>
      <xsl:value-of select="'--'"/>
    </xsl:for-each>

  </xsl:template>

  <xsl:template name="mathpower">
    <xsl:param name="base" select="0"/>
    <xsl:param name="power" select="1"/>
    <xsl:param name="result" select="1"/>
    <xsl:choose>
      <xsl:when test="$power = 0">
        <xsl:value-of select="$result"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:call-template name="mathpower">
          <xsl:with-param name="base" select="$base"/>
          <xsl:with-param name="power" select="$power - 1"/>
          <xsl:with-param name="result" select="$result * $base"/>
        </xsl:call-template>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>
4

2 回答 2

4

您不需要为此任务使用昂贵的幂函数。这是一个与 XSLT 1.0 兼容的模板,它递归地“吃掉”二进制字符串,乘以 2 并添加下一个二进制数字。

我在这里使用了一个模板,因为模板可以有默认参数,在这种情况下,integer从“外部”调用模板时不应该提供的参数。

<xsl:template name="bin2int">
  <xsl:param name="binaryString"/>
  <xsl:param name="integer" select="0"/>

  <xsl:choose>
    <xsl:when test="$binaryString=''">
      <xsl:value-of select="$integer"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:call-template name="bin2int">
        <xsl:with-param name="binaryString" select="substring($binaryString,2)"/>
        <xsl:with-param name="integer" select="2*$integer + number(substring($binaryString,1,1))"/>
      </xsl:call-template>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>
于 2013-10-31T17:05:13.850 回答
1

如果您使用的是 XSLT 2.0,那么请考虑使用函数而不是模板,因为它们可以在表达式中调用。并且power已经确定,搜索发现h​​ttp://users.atw.hu/xsltcookbook2/xsltckbk2-chp-3-sect-5.html

<!-- Power -->
<xsl:function name="ckbk:power" as="xs:double">
   <xsl:param name="base" as="xs:double"/>
   <xsl:param name="exp" as="xs:integer"/>
   <xsl:sequence 
        select="if ($exp lt 0) then ckbk:power(1.0 div $base, -$exp) 
                else 
                if ($exp eq 0) 
                then 1e0 
                else $base * ckbk:power($base, $exp - 1)"/>
</xsl:function>
于 2013-10-31T16:02:02.233 回答