我几乎可以这样说:“@##$#是什么hexavigesimal值?”
一种六维数制的基数为26.或者,基-26只能用拉丁字母的字母表示。由于英语中有26个字母,所以基- 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。能办到吗?
发布于 2012-05-25 11:11:59
试试这个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转换。例如,若要转换为十六进制,请将其更改为
<xsl:variable name="symbols" select="'0123456789ABCDEF'" />和二进制
<xsl:variable name="symbols" select="'01'" />发布于 2012-05-25 11:18:49
您可能会发现,<xsl:number value="$n" format="A"/>可以做您想做的事情,但它不能保证。
发布于 2012-05-25 13:12:04
XSLT1.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/questions/10751983
复制相似问题