0

我对 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 函数来获取版本。我没有在此处包含该代码,因为我认为它会使示例混乱。

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

谢谢,克里斯

4

2 回答 2

1

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

<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 正则表达式扩展函数(根据他们的文档)。

于 2017-02-23T18:31:24.237 回答
1

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

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

(b) 编写返回复合值的函数/表达式/命名模板。在 XSLT 1.0 中,唯一可用的复合值是节点集。然后,您遇到了结果树片段限制,即您不能返回节点集,只能返回 RTF——但这很容易使用 exslt:node-set() 规避。

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

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

于 2017-02-23T20:49:05.993 回答