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, но это становится немного отчаянным.)
В этом случае я бы пошел (а) - два отдельных вычисления.