XSLT:包含多个字符串的contains()函数

时间:2017-06-22 12:37:11

标签: xslt

我有这样的XML:

<style name='Danger'/>
<style name='Danger_2'/>
<style name='Danger_3'/>
<style name='Warning'/>
<style name='Warning_2'/>
<style name='Warning_3'/>
<style name='Body'/>

我正在尝试处理名称中包含“危险”或“警告”的所有样式。 天真的方法不起作用:

<xsl:template match="style[contains(@name, 'Danger|Warning')]">

我知道你可以在XSLT 2.0中完成匹配:

"style[@name=('Danger','Warning')]"

“包含”匹配是否有解决方案?

This related question有一个有趣的解决方案:'使用管道(或其他适当的字符)分隔字符串',但尽管使用'contains'仅适用于完全匹配(因此它将匹配'Danger'但不是'Danger_1')。

2 个答案:

答案 0 :(得分:3)

使用XSLT / XPath 2.0及更高版本,matches函数(http://maxtoroq.github.io/xpath-ref/fn/matches.html)具有正则表达式支持style[matches(@name, 'Danger|Warning')]

此外,您还可以使用style[some $s in ('Danger','Warning') satisfies contains(@name, $s)],这也适用于XSLT / XPath 2.0及更高版本。

答案 1 :(得分:1)

您是否尝试过以下操作?

<xsl:template match="style[contains(@name, 'Danger') or contains(@name, 'Warning')]">