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