4

我几乎可以在这里说:“@##$# 是什么hexavigesimal值?”

十六进制数字系统以二十六为底。或者,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>

您应该能够调整符号变量以允许任何花哨的命名转换。例如,要转换为十六进制,请将其更改为以下

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

并转为二进制

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

您可能会发现它<xsl:number value="$n" format="A"/>可以满足您的需求,但不能保证。

于 2012-05-25T11:18:49.957 回答
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>

当将此 XSLT 1.0 转换应用于此 XML 文档时:

<t>12345</t>

产生了想要的正确结果:

3039

另请参阅我对这个问题的回答

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

于 2012-05-25T13:12:04.317 回答