Ниже приведен мой код .Net VB. Как реализовать приведенный ниже код в XSLT (XSLT будет использоваться в DataPower). Поскольку у нас нет типа данных Long в XSLT, нам сложно реализовать приведенный ниже код .Net в XSLT. Можете ли вы помочь?
Public Sub Main(args() As string)
'Inputs are hardcoded
Dim strLength As Integer = 8
Dim longValue As Long = 2
'We're trying to convert Long(819) to Hex String of Length 8
Dim hexString As String = longValue.ToString("X" & strLength)
'Declaring Variables
Dim intLoop As Integer
Dim longTempValue As Long
Dim stringBuffer As New System.Text.StringBuilder(strLength)
For intLoop = 0 To strLength -2
longTempValue = Long.Parse(hexString.Substring(intLoop,2), Globalization.NumberStyles.AllowHexSpecifier)
stringBuffer.Append(Chr(longTempValue))
intLoop+=2
Next
Console.WriteLine(stringBuffer.ToString())
End Sub
Но ввод — это тип данных Long, но поскольку мы рассматривали десятичный ввод, который не мог обработать входное значение &H111 из-за ограничения диапазона. Я проверил онлайн-компилятор и смог получить шестнадцатеричное значение &H111 как 00000111.
Теперь давайте рассмотрим шестнадцатеричное значение в качестве входных данных (00000111) и будем принимать по 2 символа за раз
(1) Преобразуйте строковое представление числа в указанном стиле в его эквивалент 64-битного целого числа со знаком
(2) Преобразование в код символов (представляет определенный символ в наборе, например набор символов ANSI)
Как мы обрабатываем эти преобразования в XSLT? Я обновил полный код VB выше.
Если вы спрашиваете, как преобразовать десятичное число в шестнадцатеричное (в XSLT 1.0), см.: stackoverflow.com/a/46302451/3016153.
Datapower — это, по сути, XSLT 1.0 плюс расширения, специфичные для IBM. Расширения включают в себя множество функций преобразования между различными типами данных. Они очень плохо документированы, но там может быть что-то, что вам нужно.
Привет @michael.hor257k! Мы используем XSLT2.0. Входные данные жестко запрограммированы. Мы пытаемся преобразовать Long(819) в шестнадцатеричную строку длиной 8. Выполнение приведенного выше кода приведет к выводу: 00000333 Мы можем выполнить код VB через онлайн-компилятор - onecompiler.com/vb
Если входные данные жестко запрограммированы, почему нельзя просто жестко запрограммировать их в виде шестнадцатеричных значений?
Я жестко запрограммировал образцы значений в переменных для справки, и входные параметры будут меняться в реальном времени. Если мы сможем придумать эквивалентный код в xslt, я смогу реализовать его соответствующим образом.
Вот пример, показывающий, как можно преобразовать десятичное значение в шестнадцатеричную систему счисления с фиксированными 8 цифрами:
XML
<input>
<decimal>0</decimal>
<decimal>1</decimal>
<decimal>9</decimal>
<decimal>10</decimal>
<decimal>15</decimal>
<decimal>16</decimal>
<decimal>34</decimal>
<decimal>96</decimal>
<decimal>178</decimal>
<decimal>506</decimal>
<decimal>1308</decimal>
<decimal>9734</decimal>
<decimal>53789</decimal>
<decimal>786120</decimal>
</input>
XSLT 2.0
<xsl:stylesheet version = "2.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:math = "http://www.w3.org/2005/xpath-functions/math"
exclude-result-prefixes = "math">
<xsl:output method = "xml" version = "1.0" encoding = "UTF-8" indent = "yes"/>
<xsl:strip-space elements = "*"/>
<xsl:template match = "/input">
<output>
<xsl:for-each select = "decimal">
<xsl:variable name = "hex-values" select = "for $i in 0 to 7 return . idiv math:pow(16, $i) mod 16"/>
<hex>
<xsl:value-of select = "for $j in reverse($hex-values) return codepoints-to-string($j + (if ($j > 9) then 55 else 48))" separator = ""/>
</hex>
</xsl:for-each>
</output>
</xsl:template>
</xsl:stylesheet>
Результат
<?xml version = "1.0" encoding = "UTF-8"?>
<output>
<hex>00000000</hex>
<hex>00000001</hex>
<hex>00000009</hex>
<hex>0000000A</hex>
<hex>0000000F</hex>
<hex>00000010</hex>
<hex>00000022</hex>
<hex>00000060</hex>
<hex>000000B2</hex>
<hex>000001FA</hex>
<hex>0000051C</hex>
<hex>00002606</hex>
<hex>0000D21D</hex>
<hex>000BFEC8</hex>
</output>
Естественно, при выводе из 8 фиксированных шестнадцатеричных цифр ожидается, что входные значения будут целыми числами в диапазоне от 0 до 4294967295.
Спасибо, Михаил, это сработало. Но ввод — это тип данных Long, но поскольку мы рассматривали десятичный ввод, который не мог обработать входное значение &H111 из-за ограничения диапазона. Я проверил онлайн-компилятор и смог получить шестнадцатеричное значение &H111 как 00000111. Теперь давайте рассмотрим шестнадцатеричное значение как входное (00000111) и возьмем по 2 символа за раз (1) Преобразуем строковое представление числа в указанном стиле в его 64-битный целочисленный эквивалент со знаком ( 2) Преобразование в код символов (представляет определенный символ в наборе, например набор символов ANSI). Как мы обрабатываем эти преобразования в XSLT? Я обновил полный код VB выше.
Извините, я понятия не имею, о чем вы говорите. Я не знаю, какое строковое представление использует ваш входной XML и каковы его правила. Я подозреваю, что вам нужно сделать это в два этапа: (1) преобразовать входную строку в число, которое XSLT может понять и с которым можно работать как с числом; (2) преобразовать число в шестнадцатеричную систему счисления. Я предлагаю вам задать отдельный вопрос о (1) и точно объяснить, как выглядят входные данные. Затем перейдите к (2), как описано выше.
Привет, Майкл. Проще говоря, с помощью приведенного выше кода мы можем получить шестнадцатеричную запись. Как преобразовать этот шестнадцатеричный код в кодировку символов ASCII в XSLT?
Ваш вопрос не ясен. Если вы спрашиваете о XSLT, предоставьте минимальный воспроизводимый пример, показывающий входные данные XML, вашу попытку XSLT и ожидаемый результат. Также укажите, какую версию XSLT поддерживает ваш процессор.