(1) 我的要求是将 DECIMAL INPUT 转换为固定 8 位数字的十六进制表示法
(2) 通过一次选取 2 个字符将 HEXADECIMAL RESULT 转换为相应的字符编码。字符编码请参考以下链接
https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/character-set-0127
https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/character-set-128255
(3) 字符编码显示为 OUTPUT
(4) XSLT 可以处理所有特殊编码字符集吗?
十进制输入
<decimal>
<input>2<input>
<input>100<input>
<input>819<input>
<input>60<input>
</decimal>
十六进制结果
<input>
<hex>00000002</hex>
<hex>00000064</hex>
<hex>00000333</hex>
<hex>0000003C</hex>
</input>
输出 - 字符编码
<output>
<charset> </charset>
<charset> d</charset>
<charset> 3</charset>
<charset> <</charset>
</output>
其中一些代码超出了 ASCII 范围,但如果 ASCII 您指的是 Unicode,您可以尝试
<xsl:value-of select="concat('&#x', hex, ';')"
disable-output-escaping="yes"/>
这是使用 XSLT 2.0 的替代方案,我认为 IBM DataPower 支持它。
XSLT 2.0 包含
codepoints-to-string
函数,可以将 Unicode 代码点(数字)转换为字符串。但是将十六进制数字转换为整数仍然是一件冗长的事情(至少,我不知道有什么简单的方法可以做到这一点)。
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:hex="http://example.com/hex"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="xml" version="1.1"/>
<xsl:function name="hex:to-integer" as="xs:integer">
<xsl:param name="hex" as="xs:string"/>
<xsl:variable name="least-significant-digit"
select="substring($hex, string-length($hex))"/>
<xsl:variable name="most-significant-digits"
select="substring($hex, 1, string-length($hex) - 1)"/>
<xsl:variable name="hex-digit-value" select="
string-length(
substring-before('0123456789ABCDEF', $least-significant-digit)
)
"/>
<xsl:choose>
<xsl:when test="$most-significant-digits">
<xsl:sequence
select="$hex-digit-value + 16 * hex:to-integer($most-significant-digits)"/>
</xsl:when>
<xsl:otherwise>
<xsl:sequence select="$hex-digit-value"/>
</xsl:otherwise>
</xsl:choose>
</xsl:function>
<xsl:template match="input">
<output>
<xsl:apply-templates/>
</output>
</xsl:template>
<xsl:template match="hex">
<xsl:value-of select="codepoints-to-string(hex:to-integer(.))"/>
</xsl:template>
</xsl:stylesheet>