Преобразование XML в JSON с помощью XSLT 2.0

У меня есть XSLT, который может преобразовывать XML в JSON, и он работает хорошо. Но когда я пытаюсь изменить тип значения JSON, я не могу этого сделать.

Ниже приведен код моего файла XSLT:

<xsl:template match = "json:name" mode = "json">
    <xsl:text/>"<xsl:value-of select = "json:encode-string(.)"/>":<xsl:text/>
</xsl:template>

<xsl:template match = "json:value" mode = "json">
    <xsl:choose>
        <xsl:when test = "node() and not(text())">
            <xsl:apply-templates mode = "json"/>
        </xsl:when>
        <xsl:when test = "text()">
            <xsl:choose>
                                    <xsl:when test = "normalize-space(.) ne . or not((string(.) castable as xs:integer and not(starts-with(string(.),'+') or starts-with(string(.),'-')) and not(starts-with(string(.),'0') and not(. = '0'))) or (string(.) castable as xs:decimal and not(starts-with(string(.),'+')) and not(starts-with(.,'-.')) and not(starts-with(.,'.')) and not(starts-with(.,'-0') and not(starts-with(.,'-0.'))) and not(ends-with(.,'.')) and not(starts-with(.,'0') and not(starts-with(.,'0.'))))) and not(. = 'false') and not(. = 'true') and not(. = 'null')">
                                        <xsl:text/>"<xsl:value-of select = "json:encode-string(.)"/>"<xsl:text/>
                                    </xsl:when>
                <xsl:otherwise>
                    <xsl:text/><xsl:value-of select = "."/><xsl:text/>
                </xsl:otherwise>

            </xsl:choose>
        </xsl:when>
        <xsl:otherwise>
            <xsl:text>null</xsl:text>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

Я хочу добавить условие, что если имя элемента xml имеет идентификатор и оно не равно нулю, то преобразуйте его в строку.

Я пробовал ниже, но это не сработало.

    <xsl:template match = "id">
    <xsl:choose>
        <xsl:when test = "id">
            <xsl:text/>"<xsl:value-of select = "json:encode-string(.)"/>"<xsl:text/>
        </xsl:when>
    </xsl:choose>
</xsl:template>

Как мне перебирать эти элементы как пару ключ-значение, чтобы я мог добавить условную логику к значению, если имя совпадает?

Редактировать:

Добавлен образец XML:

<?xml version = "1.0" encoding = "UTF-8"?>
 <ns0:TestMe xmlns:ns0 = "urn:hero:wakanda:Cle:Something">
   <root>
     <id>123</id>
     <field2>345</field2>
     <fee>
        <totalFee>123</totalFee>
    </fee>
    </root>
    </ns0:TestMe>

Используя этот файл конвертера XML в JSON: https://github.com/bramstein/xsltjson/blob/master/conf/xml-to-json.xsl

Задавая вопрос XSLT, вам необходимо предоставить минимальный воспроизводимый пример: (1) Правильно сформированный входной XML. (2) Ваша логика и таблица стилей XSLT, которая пытается ее реализовать. (3) Желаемый результат, основанный на образце XML в #1 выше. (4) Процессор XSLT и его соответствие стандартам XSLT: 1.0, 2.0, 3.0 или 4.0.

Yitzhak Khabinsky 24.05.2023 14:34

@YitzhakKhabinsky Я добавил необходимые вещи

Nitin Singhal 24.05.2023 16:05

Можете ли вы отредактировать вопрос, чтобы показать нам как JSON, который код, который вы связали, создает для показанного вами образца XML, а затем объяснить и показать, чем отличается ваш желаемый вывод JSON? Непонятно, какой вам нужен результат.

Martin Honnen 24.05.2023 16:59
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
3
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

В контексте таблицы стилей, связанной с вашим вопросом, я думаю, вам нужно что-то вроде

  <xsl:template match = "json:member[json:name = 'id']/json:value" mode = "json">
    <xsl:text>"</xsl:text>
    <xsl:value-of select = "json:encode-string(.)"/>
    <xsl:text>"</xsl:text>
  </xsl:template>

чтобы получить, например. "id":"123" вместо, например. "id":123.

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