2010-11-17 85 views
35

我想从我的XML文件中获取一个节点,该节点具有诸如“latest_”之类的前缀,但这可能会改变,并且我非常希望我的XSLT尽可能流畅。这里的的XPath我想使用:节点名称上的XPath通配符

/data/stats/*_cost 

这应该与latest_costnewest_costanything_cost,有没有这样做的一种方式?

干杯:-)

+0

取决于XPath 2.0是否适用于您的环境。 XPath 1.0不允许这个和2.0。 – Younes 2010-11-17 09:53:38

+0

对于'* _cost'这样的表达式,XPath 1.0和XPath 2.0都不允许它们。 – 2010-11-17 10:01:31

回答

58

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

/data/stats/*[substring(name(), string-length(name()) - 4) = '_cost'] 
+0

公平点,我已经输入这个到我的应用程序,它做我所需要的,没有其他的缺点,看到我的评论reqsquare。谢谢。 – 2010-11-17 14:14:33

+0

@ILMV:你好。我很高兴它可以帮助你。 – 2010-11-17 14:47:32

+0

+1和感谢@ user357812 - 这对我的类似用例(匹配属性后缀)非常有帮助。如果有人感兴趣,如何做到这一点[这里](http://blog.jondh.me.uk/2011/10/simplexml-xpath-selector-attribute-not-having-suffix/)。 – halfer 2011-10-08 12:18:22

5

在XPath 1.0可以使用/data/stats/*[substring-after(name(), '_cost') = '']模式。这将检查元素的名称是否以_cost后缀结尾。在XPath 2.0中有fn:ends-with(str, str),你的对应experssion将是*[ends-with(name(), '_cost')]

+0

感谢您的回答,包含我工作得很好,因为它检查字符串是否存在。另外,我的环境似乎没有XPath 2.无论如何,干杯:-) – 2010-11-17 10:40:55

+2

@ILMV指出,这将选择一个名称中没有“_cost”的元素。检查我的答案。 – 2010-11-17 12:35:23

+0

@Alejandro,谢谢你指出我的错误。 – 2010-11-17 14:03:52

5

你也可以使用contains

e.g

/data/stats[contains(.,'_cost')] 
+0

“。”代表所有文本内容,表达式将匹配文本内容包含'_const'子字符串的所有'stats'节点。没有关于位置和节点名称的保证。 – 2010-11-17 10:09:24

+1

'/ data/stats/* [contains(local-name(),'_ cost')]''虽然会起作用... – annakata 2010-11-17 10:13:38

+0

最后我带着这个去了'[contains(local-name(),'_ cost' )]',它不会歧视那种可耻的立场,但在使用它的情况下并不重要。 – 2010-11-17 10:39:05