XSLT - 来自递归模板的变量分配

XSLT - Variable Assignment from a Recursive Template

我对 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>

我不确定我的尝试是否可行,我可能误解了模板的用途。我想在上面的 "when" 元素中分配版本,然后在 "otherwise" 中分配结束点变量(这将在递归中遇到最后一个斜杠后触发)。

为了它的价值,我只是在 XSL 的其他地方调用这个模板,并传递原始 URI 和一个“/”字符作为两个初始参数。我在 "when" 元素中意识到我需要通过一些 substring-before 和 substring-after 函数来获取版本。我没有在此处包含该代码,因为我认为它会使示例混乱。

我走在正确的轨道上吗?任何帮助或指示将不胜感激。我很乐意根据需要编辑和添加更多信息。

谢谢, 克里斯

我认为您在这里不需要递归模板。您可以将版本提取为:

<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 extension functions(根据他们的文档)。

一般来说,如果你想从一次计算中得到两项数据,有两种方法:

(a) 使用单独的函数/表达式/命名模板独立计算每一个

(b) 编写一个 return 是复合值的函数/表达式/命名模板。在 XSLT 1.0 中,唯一可用的复合值是节点集。然后你遇到了结果树片段限制,你不能 return 节点集,只有 RTF - 但是使用 exslt:node-set().

很容易绕过

(众所周知,我将复合值作为结构化字符串进行操作,例如 AAAA#BBBB,但这有点令人绝望。)

在这种情况下,我会选择 (a) - 两个单独的计算。