在XSLT 2.0中将二进制转换为十进制

时间:2013-10-31 15:40:29

标签: xslt xslt-2.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>

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

如果您使用的是XSLT 2.0,那么请考虑使用函数而不是模板,因为它们可以在表达式中调用。 power已完成,搜索会找到http://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>