2014-09-26 53 views
8

我需要的東西似乎不匹配類似標題的其他文章。XPath 1.0獨佔或節點集表達式

我需要,使用Xpath 1,能夠按照該順序切入地獲取節點a或節點b。 也就是說,節點a如果存在,否則節點b。

XPath表達式,如:

expression | expression

會讓我都在的情況下,他們都存在。那不是我想要的。

我可以去:

(expression | expression)[last()]

事實上這確實研技總祕書處我,我需要什麼(對我來說),但似乎有點低效率的,因爲它會之前評估表達式的兩邊最後的結果被選中。 我一直希望表達能夠在左側成功後停止工作。 XML

<one> 
    <two> 
    <three>hello</three> 
    <four>bye</four> 
    </two> 
    <blahfive>again</blahfive> 
</one> 

和工作中的XPath(但效率不高)的

更具體的例子:

(/one/*[starts-with(local-name(.), 'blah')] | .)[last()]

要清楚,我想抓住的直接子節點'一'以'blah'開頭。但是,如果它不存在,我只想要當前節點。 如果'blah'節點確實存在,我不想要當前節點。

有沒有更高效的方法來實現這個目標?

+1

1有趣的問題和IMHO爲它非常簡潔的解決方案。你能否詳細說明爲什麼你在這種情況下關心績效?從我的經驗看,XSLT表中的性能損失是由其他原因造成的。 – 2014-09-26 19:22:09

+0

嗨。它實際上是一個Java應用程序。該應用程序使用xpath表達式(從配置文件加載)從XML文檔中提取值。應用程序會每分鐘收到很多這樣的文件,因此提高效率對於提高(或者甚至達到)可靠的吞吐量非常重要。 – svaens 2014-09-26 20:25:00

+2

如果將它嵌入到Java中,只有當第一個XPath不會產生結果時,纔可以通過顯式執行第二個XPath來控制子表達式,是不是? – 2014-09-26 21:46:32

回答

1

我需要,使用Xpath 1,能夠按順序獲得節點a或節點b, 。也就是說,如果節點a存在,則節點a,否則爲 節點b。

XPath表達式,如:

expression | expression

會讓我都在的情況下,他們都存在。那不是我想要的。

我可以去:

(expression | expression)[last()]

事實上這確實研技總祕書處我,我需要什麼(在我的情況),

這種說法是不正確的

這裏是一個例子。讓我們有這個XML文檔:

<one> 
    <a/> 
    <b/> 
</one> 

expression1爲

/*/a 

expression2爲

/*/b 

您的複合式

(Expression1 | Expression2)[last()] 

當我們代入上述兩個表達式是:

(/*/a | /*/b)[last()] 

而這種表達實際上選擇b - 不a - 因爲b是最後兩個文檔順序。

現在,這裏是如果存在選擇只是a的表達,並選擇b只有a不存在 - 無論文檔順序:

/*/a | /*/b[not(/*/a)] 

當這個表達式的XML評估無論其文檔順序如何,請選擇a - 嘗試在位於ab之上的XML文檔中交換,以確認在這兩種情況下,所選元素均爲a

總之,一個表達選擇想要的節點無論任何文檔順序是:

Expression1 | Expression2[not(Expression1)] 

讓我們在您的案件,不適用此一般表達式:

expression1爲

/one/*[starts-with(local-name(.), 'blah')] 

表達式2爲

self::node() 

的想要表達(在上述的一般表達式代表達式1和表達式之後)是:

/one/*[starts-with(local-name(.), 'blah')] 
| 
    self::node()[not(/one/*[starts-with(local-name(.), 'blah')])]