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>

我不确定我的尝试是可能的,我可能会误解模板要交付的内容。我想在上面的" whe wher"元素中分配版本,然后在"否则"中分配终点变量(在递归中遇到最后一个斜线之后会触发)。

对于它的价值,我只将此模板称为XSL中的其他位置,然后将原始URI和A'/'字符作为两个初始参数。我意识到在" Whes"元素中,我需要通过函数和子字符串函数来获取版本。我认为这是一个示例。

,我没有包含该代码。

我在正确的道路上吗?任何帮助或指示都将不胜感激。我将很高兴编辑并根据需要添加更多信息。

谢谢克里斯

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

<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正则表达式扩展功能(根据其文档)。

通常,如果您想从计算中获取两个数据,则有两种方法:

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

(b)编写返回复合值的函数/表达式/命名模板。在XSLT 1.0中,唯一可用的复合值是一个节点。然后,您可以击中无法返回节点的结果-TREE-FRAGMENT限制,仅RTFS-但是使用exslt很容易绕过:node-set()。

(我知道我可以将复合值作为结构化字符串,例如AAAA#BBBB,但这变得有些绝望。)

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

相关内容

  • 没有找到相关文章

最新更新