XSLT - присвоение переменной из рекурсивного шаблона

Я довольно новичок в XSL(T). Я не уверен, что это актуально, но я работаю с IBM DataPower.

Я пытаюсь использовать XSL для анализа входящего URI, который выглядит следующим образом:

http://ip:port/Nucleus_v2.9.3/SomeEndPoint

Я хочу извлечь версию (2.9.3) в одну переменную и пункт назначения (SomeEndPoint) во вторую переменную. Я пытаюсь использовать рекурсивный шаблон, который принимает два параметра (вышеуказанный URI и символ косой черты). В шаблоне я хотел бы использовать элемент, который будет отслеживать URI и записывать оба значения в переменные.

<xsl:template name="parseIncomingURI">
    <xsl:param name="string" />
    <xsl:param name="char" />
    <xsl:choose>
        <xsl:when test="contains($string, $char) and contains($string, 'Nucleus_v')">
            <xsl:call-template name="parseIncomingURL">
                <xsl:with-param name="string" select="substring-after($string, $char)" />
                <xsl:with-param name="char" select="$char" />
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

Я не уверен, что то, что я пытаюсь сделать, возможно, и я могу неправильно понять, что шаблон предназначен для доставки. Я хочу назначить версию в элементе "когда" выше, а затем назначить переменную конечной точки в "иначе" (которая сработает после того, как в рекурсии встретится последний слеш).

Что бы это ни стоило, я просто вызываю этот шаблон в другом месте XSL и передаю исходный URI и символ "/" в качестве двух начальных параметров. Я понимаю, что в элементе "когда" мне нужно было бы получить версию через некоторые функции substring-before и substring-after. У меня нет этого кода здесь, так как я думаю, что он загромождает пример.

Я на правильном пути? Любая помощь или указатели будут с благодарностью. Я буду рад отредактировать и добавить дополнительную информацию по мере необходимости.

Спасибо Крис

2 ответа

Решение

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

<xsl:variable name="version" select="substring-before(substring-after(URI, 'Nucleus_v'), '/')" />       

и пункт назначения как:

<xsl:variable name="destination" select="substring-after(substring-after(URI, 'Nucleus_v'), '/')" />    

Это чисто решение XSLT 1.0; если вы используете IBM DataPower, у вас также есть доступ к функциям расширения EXSLT Regular Expression (согласно их документации).

Обычно, если вы хотите получить два элемента данных из вычисления, есть два способа сделать это:

(а) вычислять каждый независимо, используя отдельные функции / выражения / именованные шаблоны

(б) написать функцию / выражение / именованный шаблон, который возвращает составное значение. В XSLT 1.0 единственный доступный тип составного значения - это набор узлов. Затем вы сталкиваетесь с ограничением фрагмента дерева результатов, что вы не можете возвращать наборы узлов, только RTF - но это легко обойти, используя exslt: node-set ().

(Мне известно, что манипулировать составными значениями как структурированными строками, например, AAAA#BBBB, но это становится немного отчаянным.)

В этом случае я бы пошел (а) - два отдельных вычисления.

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