首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >需要:xsl:模板,该模板将节点转换为其十六进制值?

需要:xsl:模板,该模板将节点转换为其十六进制值?
EN

Stack Overflow用户
提问于 2012-05-25 09:36:52
回答 3查看 153关注 0票数 4

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

一种六维数制的基数为26.或者,基-26只能用拉丁字母的字母表示。由于英语中有26个字母,所以基- 26也是可能的最高基数,因此使用每个字母。0表示为A,1= B,2=C. 24 = Y,25 = Z。一些例子: 26 = AA,30 = BE

因此,它基本上就是Excel使用的列描述。我希望有一个函数将带有int值的节点转换为此值。

来源:

代码语言:javascript
运行
复制
<root>
  <row>12</row>
  <column>23</column>
</root>

我想通过调用一个执行转换的模板,将column打印为X。能办到吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-25 11:11:59

试试这个XSLT..。

代码语言:javascript
运行
复制
<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时

代码语言:javascript
运行
复制
<root>
   <row>12</row>
   <column>23</column>
   <row>26</row>
   <column>23</column>
</root>

以下是输出

代码语言:javascript
运行
复制
<root>
  <row>M</row>
  <column>23</column>
  <row>BA</row>
  <column>23</column>
</root>

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

代码语言:javascript
运行
复制
<xsl:variable name="symbols" select="'0123456789ABCDEF'" />

和二进制

代码语言:javascript
运行
复制
<xsl:variable name="symbols" select="'01'" />
票数 1
EN

Stack Overflow用户

发布于 2012-05-25 11:18:49

您可能会发现,<xsl:number value="$n" format="A"/>可以做您想做的事情,但它不能保证。

票数 0
EN

Stack Overflow用户

发布于 2012-05-25 13:12:04

XSLT1.0中的使用

代码语言:javascript
运行
复制
 <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'

这里是一个完整的示例

代码语言:javascript
运行
复制
<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文档时,

代码语言:javascript
运行
复制
<t>12345</t>

想要的,正确的结果产生:

代码语言:javascript
运行
复制
3039

也见我对这个问题的回答

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10751983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档