XSLT - 递归模板的变量赋值

时间:2017-02-23 18:15:31

标签: xml xslt recursion xsl-variable

我是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函数来获取版本。我没有包含这里的代码,因为我觉得它使这个例子变得混乱。

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

谢谢, 克里斯

1 个答案:

答案 0 :(得分:1)

我认为你不需要这里的递归模板。您可以将版本解压缩为:

if((day < 1) || (day > 31)) return false; 

,目的地为:

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

这是一个纯粹的XSLT 1.0解决方案;如果您使用的是IBM DataPower,您还可以访问EXSLT Regular Expression extension functions(根据他们的文档)。