如果我有这样的一个源文件:你如何与XSLT进行通配符匹配?
<animal name="fred_monkey" />
<animal name="jim_banana" />
<animal name="joe_monkey" />
我可以做我的样式表与他们的名字字符串“_monkey”只选择动物XPATH表达式?
例如通配符匹配'* _monkey'?
如果我有这样的一个源文件:你如何与XSLT进行通配符匹配?
<animal name="fred_monkey" />
<animal name="jim_banana" />
<animal name="joe_monkey" />
我可以做我的样式表与他们的名字字符串“_monkey”只选择动物XPATH表达式?
例如通配符匹配'* _monkey'?
我可以做一个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']">
很好的答案。谢谢! – 2010-10-15 13:32:55
+1有关详细解释。 – 2010-10-15 14:16:24
我该如何使用它:在XSLT 1.0中匹配(名称(。),'grp')]“>'' xsl:for-each select = – Si8 2015-10-28 17:32:29
你用什么版本的XSLT的? – 2010-10-15 13:08:57
好问题,+1。查看我对XSLT 1.0和XSLT 2.0解决方案的回答。:) – 2010-10-15 13:19:46
@iasha我目前使用1.0,但有兴趣了解两者之间的差异。 – 2010-10-15 13:31:28