我想從我的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