Как преобразовать тип данных Long в формат Hex в XSLT и выполнить длинный анализ в XSLT. XSLT для использования в DataPower

Ниже приведен мой код .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, предоставьте минимальный воспроизводимый пример, показывающий входные данные XML, вашу попытку XSLT и ожидаемый результат. Также укажите, какую версию XSLT поддерживает ваш процессор.

michael.hor257k 17.07.2024 22:12

Если вы спрашиваете, как преобразовать десятичное число в шестнадцатеричное (в XSLT 1.0), см.: stackoverflow.com/a/46302451/3016153.

michael.hor257k 17.07.2024 22:16

Datapower — это, по сути, XSLT 1.0 плюс расширения, специфичные для IBM. Расширения включают в себя множество функций преобразования между различными типами данных. Они очень плохо документированы, но там может быть что-то, что вам нужно.

Michael Kay 17.07.2024 23:39

Привет @michael.hor257k! Мы используем XSLT2.0. Входные данные жестко запрограммированы. Мы пытаемся преобразовать Long(819) в шестнадцатеричную строку длиной 8. Выполнение приведенного выше кода приведет к выводу: 00000333 Мы можем выполнить код VB через онлайн-компилятор - onecompiler.com/vb

Ram Adabala 18.07.2024 05:23

Если входные данные жестко запрограммированы, почему нельзя просто жестко запрограммировать их в виде шестнадцатеричных значений?

michael.hor257k 18.07.2024 06:19

Я жестко запрограммировал образцы значений в переменных для справки, и входные параметры будут меняться в реальном времени. Если мы сможем придумать эквивалентный код в xslt, я смогу реализовать его соответствующим образом.

Ram Adabala 18.07.2024 06:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот пример, показывающий, как можно преобразовать десятичное значение в шестнадцатеричную систему счисления с фиксированными 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 выше.

Ram Adabala 18.07.2024 10:37

Извините, я понятия не имею, о чем вы говорите. Я не знаю, какое строковое представление использует ваш входной XML и каковы его правила. Я подозреваю, что вам нужно сделать это в два этапа: (1) преобразовать входную строку в число, которое XSLT может понять и с которым можно работать как с числом; (2) преобразовать число в шестнадцатеричную систему счисления. Я предлагаю вам задать отдельный вопрос о (1) и точно объяснить, как выглядят входные данные. Затем перейдите к (2), как описано выше.

michael.hor257k 18.07.2024 11:37

Привет, Майкл. Проще говоря, с помощью приведенного выше кода мы можем получить шестнадцатеричную запись. Как преобразовать этот шестнадцатеричный код в кодировку символов ASCII в XSLT?

Ram Adabala 18.07.2024 12:41

Другие вопросы по теме