4

hexavigesimal「@##$# は何の値ですか?」と言うことができます。

16 進法は、基数が 26 です。あるいは、base-26 は、ラテン アルファベットの文字のみを使用して表すこともできます。英語には 26 文字あるため、base-26 はこれが可能な最高の基数でもあり、したがってすべての文字を利用します。0 は A、1 = B、2 = C ... 24 = Y、25 = Z で表されます。いくつかの例: 26 = AA、30 = BE

したがって、基本的には Excel が列の説明を使用するものです。int 値を持つノードをこの値に変換する関数が欲しいです。

ソース:

<root>
  <row>12</row>
  <column>23</column>
</root>

変換を行うテンプレートを呼び出して印刷columnしたいと思います。Xそれはできますか?

4

3 に答える 3

1

このXSLTを試してみてください...

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

   <xsl:variable name="symbols" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
   <xsl:variable name="symbols-count" select="string-length($symbols)" />
   <xsl:template match="row">
      <row>
      <xsl:call-template name="convert" />
      </row>
   </xsl:template>

   <xsl:template name="convert">
      <xsl:param name="value" select="number(.)" />
      <xsl:choose>
         <xsl:when test="$value >= $symbols-count">
            <xsl:variable name="div" select="floor($value div $symbols-count)" />
            <xsl:variable name="remainder" select="$value - $div * $symbols-count" />
            <xsl:call-template name="convert">
               <xsl:with-param name="value" select="$div" />
            </xsl:call-template>
            <xsl:value-of select="substring($symbols, $remainder + 1, 1)" />
         </xsl:when>
         <xsl:otherwise>
            <xsl:value-of select="substring($symbols, $value + 1, 1)" />
         </xsl:otherwise>
      </xsl:choose>
   </xsl:template>

   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

以下のXMLに当てはめると

<root>
   <row>12</row>
   <column>23</column>
   <row>26</row>
   <column>23</column>
</root>

以下が出力されます

<root>
  <row>M</row>
  <column>23</column>
  <row>BA</row>
  <column>23</column>
</root>

任意の派手な名前の imal 変換を許可するように、シンボル変数を調整できるはずです。たとえば、16 進数に変換するには、次のように変更します。

<xsl:variable name="symbols" select="'0123456789ABCDEF'" />

そしてバイナリへ

<xsl:variable name="symbols" select="'01'" />
于 2012-05-25T11:11:59.293 に答える
0

XSLT 1.0では、以下を使用します

 <xsl:template name="toHex">
   <xsl:param name="decimalNumber" />
   <xsl:if test="$decimalNumber >= 16">
     <xsl:call-template name="toHex">
       <xsl:with-param name="decimalNumber" 
              select="floor($decimalNumber div 16)" />
       </xsl:call-template>
   </xsl:if>
   <xsl:value-of select=
      "substring($hexDigits, ($decimalNumber mod 16) + 1, 1)" />
 </xsl:template>

$hexDigits文字列はどこにありますか'0123456789ABCDEF'

完全な例を次に示します。

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

    <xsl:variable name="hexDigits" select="'0123456789ABCDEF'"/>

    <xsl:template match="/*">
      <xsl:call-template name="toHex"/>
    </xsl:template>

    <xsl:template name="toHex">
        <xsl:param name="decimalNumber" select="." />
        <xsl:if test="$decimalNumber >= 16">
            <xsl:call-template name="toHex">
                <xsl:with-param name="decimalNumber" select=
                  "floor($decimalNumber div 16)" />
            </xsl:call-template>
        </xsl:if>
        <xsl:value-of select=
         "substring($hexDigits, ($decimalNumber mod 16) + 1, 1)" />
    </xsl:template>
</xsl:stylesheet>

このXSLT1.0変換がこのXMLドキュメントに適用される場合:

<t>12345</t>

必要な正しい結果が生成されます。

3039

この質問に対する私の答えも参照してください

https://stackoverflow.com/a/3053656/36305

于 2012-05-25T13:12:04.317 に答える
0

あなたはそれがあなたが望むことをするかもしれません<xsl:number value="$n" format="A"/>が、それは保証されていません.

于 2012-05-25T11:18:49.957 に答える