如果我有这样的源文件:
<animal name="fred_monkey" />
<animal name="jim_banana" />
<animal name="joe_monkey" />
我可以在样式表中执行XPATH表达式,只选择名称中带有字符串'_monkey'的动物吗?
e.g。通配符'* _monkey'?
答案 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')]">