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

Chr*_*ver 9 xml xslt

如果我有这样的源文件:

<animal name="fred_monkey" />
<animal name="jim_banana" />
<animal name="joe_monkey" />
Run Code Online (Sandbox Code Playgroud)

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

例如,通配符'*_monkey'?

Dim*_*hev 29

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

例如,通配符'*_monkey'?

此通配符表示 "_monkey" 结尾的字符串,而不是包含 "_monkey" 的字符串.

用途:

//animal[ends-with(@name, '_monkey')]
Run Code Online (Sandbox Code Playgroud)

以上使用标准XPath 2.0功能ends-with(),因此仅在XSLT 2.0中可用.

在XSLT 1.0中,使用以下XPath 1.0表达式:

//animal[substring(@name, string-length(@name) -6)='_monkey']
Run Code Online (Sandbox Code Playgroud)

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

/*/animal[ends-with(@name, '_monkey')]
Run Code Online (Sandbox Code Playgroud)

/*/animal[substring(@name, string-length(@name) -6)='_monkey']
Run Code Online (Sandbox Code Playgroud)

根据自己的具体需求(例如,你真的意味着"包含"而不是"结尾"),该功能contains(),starts-with()并且substring()也可能是有用的:

contains(someString, someTargetString)

starts-with(someString, someTargetString)

substring(someString, start-index, length) = someTargetString
Run Code Online (Sandbox Code Playgroud)

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

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

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

<xsl:template match=
  "animal[substring(@name, string-length(@name) -6)='_monkey']">
Run Code Online (Sandbox Code Playgroud)