2017-02-23 108 views
0

我对XSL(T)很新颖。我不确定它的相关性,但我正在与IBM DataPower合作。XSLT - 从递归模板变量赋值

我试图使用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函数获取版本。我认为这里没有包含代码,因为我认为它会混淆这个例子。

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

谢谢, 克里斯

+0

“*在模板中,我希望使用一个元素跟踪URI并将这两个值捕获到变量中。*“这不会有效:模板中定义的变量将被限制在该模板的范围内 –

+0

很高兴知道,我也想知道,我会在今天晚些时候看到你的答案。我认为可能不仅仅是从URI路径中提取两个变量,而是从递归路径开始,所以我想对'/'进行分割,但是找到了这是不是直接可能的,递归可能是一种可能的解决方法。方式更多的信息比你想要的大声笑...但多数民众赞成什么让我首先递归 –

+0

递归会有道理,如果你有多个前缀/后缀对,并且需要提取第n个标记。下面是一个示例,显示如何在最后一个标记之前获取标记 - 虽然使用了统一的分隔符:http://stackoverflow.com/questions/38848374/how-to-find-last -to-预览工作及商店到我场功能于XSLT/38848925#38848925 –

回答

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 Regular Expression extension functions(根据其文档)。

+0

谢谢michael.hor257k。我会用这个。我非常欣赏链接到EXSLT Regex扩展功能。我正在用IBM DataPower开始一段充满希望的漫长旅程,我相信这会派上用场。 -Chris –

+0

根据他们的文档,他们支持各种各样的EXSLT功能 - 其中一些可以非常方便。 –

1

一般来说,如果你想从一个计算得到两个数据项,有这样做的方法有两种:

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

( b)编写一个返回复合值的函数/表达式/命名模板。在XSLT 1.0中,唯一可用的复合值是节点集。然后点击结果树片段限制,即无法返回节点集,仅限​​于RTF - 但这很容易使用exslt:node-set()来绕过。

(我已经知道操纵复合值作为结构化的字符串,例如AAAA#BBBB,但是这变得有点绝望了。)

在这种情况下,我会去(一) - 两个独立的计算。

+0

谢谢迈克尔,同意,(一)是我打算去的方式。实际上,我只是将michael.hor257k的答案看作是两个基于函数的计算,我想我会一起去的。这里只需递归模板。我非常感谢你的回答,如果可以的话,我会加倍努力。非常感谢。 –