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) - 两个单独的计算。
我对 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) - 两个单独的计算。