0

私は、XSLT 2.0 で 2 進数を 10 進数に変換するコードを作成しましたが、結果の各数値の累乗値を加算する作業に行き詰まりました。助けてください。

<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 を掛けて次の 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 に答える