十进制 -> 十六进制 -> XSLT 中的字符编码

问题描述 投票:0回答:2

(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>
xslt type-conversion hex ascii ibm-datapower
2个回答
0
投票

其中一些代码超出了 ASCII 范围,但如果 ASCII 您指的是 Unicode,您可以尝试

<xsl:value-of select="concat('&amp;#x', hex, ';')"
  disable-output-escaping="yes"/>

0
投票

这是使用 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>
© www.soinside.com 2019 - 2024. All rights reserved.