我想从我的XML文件中获取一个节点,该节点具有诸如“latest_”之类的前缀,但这可能会改变,并且我非常希望我的XSLT尽可能流畅。这里的的XPath我想使用:节点名称上的XPath通配符
/data/stats/*_cost
这应该与latest_cost
,newest_cost
,anything_cost
,有没有这样做的一种方式?
干杯:-)
我想从我的XML文件中获取一个节点,该节点具有诸如“latest_”之类的前缀,但这可能会改变,并且我非常希望我的XSLT尽可能流畅。这里的的XPath我想使用:节点名称上的XPath通配符
/data/stats/*_cost
这应该与latest_cost
,newest_cost
,anything_cost
,有没有这样做的一种方式?
干杯:-)
这是正确的XPath 1.0表达式至极,在任何命名空间中最后5个字符的名称等于“_cost”中选择一个元素。
/data/stats/*[substring(name(), string-length(name()) - 4) = '_cost']
公平点,我已经输入这个到我的应用程序,它做我所需要的,没有其他的缺点,看到我的评论reqsquare。谢谢。 – 2010-11-17 14:14:33
@ILMV:你好。我很高兴它可以帮助你。 – 2010-11-17 14:47:32
+1和感谢@ user357812 - 这对我的类似用例(匹配属性后缀)非常有帮助。如果有人感兴趣,如何做到这一点[这里](http://blog.jondh.me.uk/2011/10/simplexml-xpath-selector-attribute-not-having-suffix/)。 – halfer 2011-10-08 12:18:22
在XPath 1.0可以使用/data/stats/*[substring-after(name(), '_cost') = '']
模式。这将检查元素的名称是否以_cost
后缀结尾。在XPath 2.0中有fn:ends-with(str, str)
,你的对应experssion将是*[ends-with(name(), '_cost')]
。
感谢您的回答,包含我工作得很好,因为它检查字符串是否存在。另外,我的环境似乎没有XPath 2.无论如何,干杯:-) – 2010-11-17 10:40:55
@ILMV指出,这将选择一个名称中没有“_cost”的元素。检查我的答案。 – 2010-11-17 12:35:23
@Alejandro,谢谢你指出我的错误。 – 2010-11-17 14:03:52
你也可以使用contains
e.g
/data/stats[contains(.,'_cost')]
“。”代表所有文本内容,表达式将匹配文本内容包含'_const'子字符串的所有'stats'节点。没有关于位置和节点名称的保证。 – 2010-11-17 10:09:24
'/ data/stats/* [contains(local-name(),'_ cost')]''虽然会起作用... – annakata 2010-11-17 10:13:38
最后我带着这个去了'[contains(local-name(),'_ cost' )]',它不会歧视那种可耻的立场,但在使用它的情况下并不重要。 – 2010-11-17 10:39:05
取决于XPath 2.0是否适用于您的环境。 XPath 1.0不允许这个和2.0。 – Younes 2010-11-17 09:53:38
对于'* _cost'这样的表达式,XPath 1.0和XPath 2.0都不允许它们。 – 2010-11-17 10:01:31