节点名称上的XPath通配符

Ben*_*ard 43 xml xslt xpath

我想从我的XML文件中获取一个节点,该节点有一个前缀,例如"latest_",但这可能会改变,我希望我的XSLT尽可能流畅.这是我想要使用的XPath:

/data/stats/*_cost
Run Code Online (Sandbox Code Playgroud)

这应该与latest_cost,newest_cost,anything_cost,有没有这样做的一种方式?

干杯:-)

小智 66

这是正确的XPath 1.0表达式,它在任何命名空间中选择一个名称等于"_cost"的最后5个字符的元素.

/data/stats/*[substring(name(), string-length(name()) - 4) = '_cost']
Run Code Online (Sandbox Code Playgroud)


red*_*are 9

你也可以用 contains

例如

/data/stats[contains(.,'_cost')] 
Run Code Online (Sandbox Code Playgroud)

  • 我最终选择了“[contains(local-name(),'_cost')]”,它不会歧视位置,这是一种耻辱,但在其使用的上下文中,这并不重要。 (2认同)
  • 这是错的.这会在其字符串值中选择一个"stats"元素组合"_cost".检查我的答案. (2认同)

小智 7

以上对我不起作用。我不得不“稍微”修改如下:

/data/stats/*[contains(name(),'_cost')]
Run Code Online (Sandbox Code Playgroud)


Ale*_*kov 6

使用XPath 1.0,您可以使用/data/stats/*[substring-after(name(), '_cost') = '']模式.检查元素的名称是否以_cost后缀结尾.

在XPath 2.0中,有fn:ends-with(str, str)相应的表达式*[ends-with(name(), '_cost')].

  • 正如@ILMV指出的那样,这将选择一个名称中没有"_cost"的元素.检查我的答案. (2认同)
  • [substring-after(name(),'_ cost')='']对于任何不包含'_cost'的名称(),也是如此,-1 (2认同)