2010-10-15 58 views
9

如果我有这样的一个源文件:你如何与XSLT进行通配符匹配?

<animal name="fred_monkey" /> 
<animal name="jim_banana" /> 
<animal name="joe_monkey" /> 

我可以做我的样式表与他们的名字字符串“_monkey”只选择动物XPATH表达式?

例如通配符匹配'* _monkey'?

+0

你用什么版本的XSLT的? – 2010-10-15 13:08:57

+0

好问题,+1。查看我对XSLT 1.0和XSLT 2.0解决方案的回答。:) – 2010-10-15 13:19:46

+0

@iasha我目前使用1.0,但有兴趣了解两者之间的差异。 – 2010-10-15 13:31:28

回答

26

我可以做一个XPath表达式我 样式与在 他们的名字字符串“_monkey”只选择 动物?

例如通配符匹配'* _monkey'?

此通配符意味着 “_monkey” 结尾,不含有 “_monkey” 的字符串的字符串。

使用

//animal[ends-with(@name, '_monkey')] 

上面使用标准的XPath 2.0功能ends-with()并且因此仅在XSLT 2.0。

在XSLT 1.0使用下面的XPath 1.0表达式

//animal[substring(@name, string-length(@name) -6)='_monkey'] 

不建议使用//缩写,因为这可能导致低效评价。只要知道XML文档的结构,就可以使用更具体的位置测试链。例如,如果animal元素是XML文档,则下面的XPath的顶部元件的所有子(2.0或1.0,分别地)的表达式可能是更有效的:

/*/animal[ends-with(@name, '_monkey')] 

/*/animal[substring(@name, string-length(@name) -6)='_monkey'] 

取决于一个人的特定需求(例如,你真的意味着“包含”而不是“结尾”),该功能contains()starts-with()substring()也可能是有用的:

contains(someString, someTargetString) 

starts-with(someString, someTargetString) 

substring(someString, start-index, length) = someTargetString 

最后,<xsl:templates>match属性不需要包含绝对XPath表达式 - 只是建议使用指定足够上下文的相对XPath表达式。

因此,上述用于匹配表达式将东西如下:

<xsl:template match="animal[ends-with(@name, '_monkey')]"> 

<xsl:template match= 
    "animal[substring(@name, string-length(@name) -6)='_monkey']"> 
+0

很好的答案。谢谢! – 2010-10-15 13:32:55

+3

+1有关详细解释。 – 2010-10-15 14:16:24

+0

我该如何使用它:在XSLT 1.0中匹配(名称(。),'grp')]“>'' Si8 2015-10-28 17:32:29