你如何使用XSLT进行通配符匹配?

时间:2010-10-15 12:56:35

标签: xml xslt

如果我有这样的源文件:

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

我可以在样式表中执行XPATH表达式,只选择名称中带有字符串'_monkey'的动物吗?

e.g。通配符'* _monkey'?

1 个答案:

答案 0 :(得分:28)

  

我可以在我的中进行XPATH表达吗?   样式表只选择   带有'_monkey'字符串的动物   他们的名字?

     

e.g。通配符'* _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

最后,match的{​​{1}}属性不需要包含绝对XPath表达式 - 只是建议指定足够上下文的相对XPath表达式使用

因此,上面用作匹配表达式的内容将是:

<xsl:templates>

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