2010-11-17 115 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