Как использовать для каждого элемента в качестве параметра шаблона - PullRequest
0 голосов
/ 03 марта 2019

Я знаю, что название не звучит слишком описательно для моей проблемы. Позвольте мне объяснить более подробно ниже.

У меня есть Java-приложение, которое возвращает JSON Array, моя задача - проанализировать этот результат вформат String для использования в другом приложении "C", единственно возможная связь между этими двумя приложениями - это формат String.

Я достиг этого, используя XSLT, жестко кодируя значения, которые я ищу внутриОтвет JSON и вот как я это сделал.

Мой XML:

<?xml version="1.0" encoding="UTF-8"?>
<input>[{"media_key":"1-1UL-12528","media_value":"10 RUE DES TRELISSAC","media_type":"Courrier"},{"media_key":"2-1UL-12528","media_value":"0614263770","media_type":"SMS"}]</input>

, а мой XSL:

<?xml version="1.0" encoding="UTF-8" ?>

<xsl:template match="input">
    <output>
        <xsl:call-template name="print-object-values">
            <xsl:with-param name="string" select="."/>
        </xsl:call-template>
    </output>
</xsl:template>

<!-- Recupere la valeur d'une cle json String de type "key":"val" -->
<xsl:template name="get_string_json">
    <xsl:param name = "json" />
    <xsl:param name = "key" />

    <xsl:variable name="needle">
        <xsl:value-of select="concat('&quot;', $key, '&quot;:&quot;')" />
    </xsl:variable>

    <xsl:value-of select="substring-before(substring-after($json, $needle), '&quot;')" />
</xsl:template>


<xsl:template name="print-object-values">
    <xsl:param name="string"/>
    <xsl:param name="sep_values" select="';'" />

    <xsl:if test="contains($string,'media_key')">
        <xsl:text>|</xsl:text>

        <!-- Partie à modifier en récupérant les valeurs désiré par les fonctions déclarer prècedemment -->
        <xsl:call-template name="get_string_json">
            <xsl:with-param name="json" select="$string" />
            <xsl:with-param name="key" select="'media_key'" />
        </xsl:call-template>
        <xsl:value-of select="$sep_values" />
        <xsl:call-template name="get_string_json">
            <xsl:with-param name="json" select="$string" />
            <xsl:with-param name="key" select="'media_type'" />
        </xsl:call-template>
        <xsl:value-of select="$sep_values" />
        <xsl:call-template name="get_string_json">
            <xsl:with-param name="json" select="$string" />
            <xsl:with-param name="key" select="'media_value'" />
        </xsl:call-template>

        <xsl:call-template name="print-object-values">
            <xsl:with-param name="string" select="substring-after($string,'&quot;},{')"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

в моем шаблоне print-object-values ​​я использую print-object-values, чтобы получить значение определенного ключа в строке JSON.

Вместо того, что я хочу сделать, вместожестко запрограммировав строку, которую я ищу, есть ли способ реализовать это в переменной в виде карты, а затем использовать ее в цикле for-each для выполнения get_string_json?

EDIT:

вот пример того, что яхочу достичь

<xsl:template match="input">
    <output>
        <xsl:variable name="values">  <!-- declaration of the values to search for -->
            <value>
                <param>media_key</param>
                <param>media_type</param>
                <param>media_value</param>
            </value> 
        </xsl:variable>

        <xsl:call-template name="print-object-values">
            <xsl:with-param name="string" select="."/>
        </xsl:call-template>
    </output>
</xsl:template>

<xsl:template name="get_string_json">
    <xsl:param name = "json" />
    <xsl:param name = "key" />

    <xsl:variable name="needle">
        <xsl:value-of select="concat('&quot;', $key, '&quot;:&quot;')" />
    </xsl:variable>

    <xsl:value-of select="substring-before(substring-after($json, $needle), '&quot;')" />
</xsl:template>


<xsl:template name="print-object-values">
    <xsl:param name="string"/>
    <xsl:param name="sep_values" select="';'" />

    <xsl:if test="contains($string,'media_key')">
        <xsl:text>|</xsl:text>

        <xsl:for-each select= ><!-- select params in the variable values -->
            <xsl:call-template name="get_string_json">
                <xsl:with-param name="json" select="$string" />
                <xsl:with-param name="key" select="" /><!-- pass the value of the param -->
            </xsl:call-template>
        </xsl:for-each>
        <xsl:call-template name="print-object-values">
            <xsl:with-param name="string" select="substring-after($string,'&quot;},{')"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

1 Ответ

0 голосов
/ 04 марта 2019

ВАЖНО:
Цель этого ответа - ответить на только эту часть вашего вопроса:

вместо жесткого кодированияСтрока, которую я ищу, есть ли способ реализовать это в переменной в виде карты, а затем использовать ее в цикле for-each для выполнения get_string_json?

Я нашел необходимым сделатьнекоторые изменения в других частях вашего XSLT, но я не проверял ваш метод анализа JSON.

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />

<!-- declaration of the values to search for -->
<xsl:variable name="keys">  
    <key>media_key</key>
    <key>media_type</key>
    <key>media_value</key>
</xsl:variable>

<xsl:template match="input">
    <output>
        <xsl:call-template name="print-object-values">
            <xsl:with-param name="string" select="."/>
        </xsl:call-template>
    </output>
</xsl:template>

<xsl:template name="print-object-values">
    <xsl:param name="string"/>
    <xsl:param name="separator" select="'&quot;},{'" />

    <xsl:variable name="object" select="substring-before(concat($string, $separator), $separator)" />

    <xsl:text>|</xsl:text>

    <!-- HERE IS THE RELEVANT PART -->
    <xsl:for-each select="exsl:node-set($keys)/key">
        <xsl:call-template name="get_string_json">
            <xsl:with-param name="json" select="concat($object, '&quot;')" />
            <xsl:with-param name="key" select="." />
        </xsl:call-template>
        <xsl:if test="position()!=last()">
            <xsl:text>;</xsl:text>
        </xsl:if>
    </xsl:for-each>

    <xsl:if test="contains($string, $separator)">
        <xsl:call-template name="print-object-values">
            <xsl:with-param name="string" select="substring-after($string, $separator)"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

<!-- Recupere la valeur d'une cle json String de type "key":"val" -->
<xsl:template name="get_string_json">
    <xsl:param name = "json" />
    <xsl:param name = "key" />

    <xsl:variable name="needle">
        <xsl:value-of select="concat('&quot;', $key, '&quot;:&quot;')" />
    </xsl:variable>

    <xsl:value-of select="substring-before(substring-after($json, $needle), '&quot;')" />
</xsl:template>

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...