2015-05-18 29 views
1

我有一個包含開始和結束日期的日期範圍(期間)的XML列表。我需要查詢列表,並返回Start元素(或位置),當我找到一個匹配,但我不知道我怎麼能做到這一點。如何使用XSL查詢XML元素並返回結果?

這裏的樣本數據:

<Calendar> 
    <Period> 
     <Start>20150501</Start> 
     <End>20150514</End> 
    </Period> 
    <Period> 
     <Start>20150515</Start> 
     <End>20150531</End> 
    </Period> 
    <Period> 
     <Start>20150601</Start> 
     <End>201506014</End> 
    </Period> 
    <Period> 
     <Start>20150615</Start> 
     <End>201506030</End> 
    </Period> 
<Calendar> 

我用這個XPATH找到我的輸出中,但我怎麼能回到開始的元素值或者是持何立場?

//Calendar/Period[Start <= '20150518' and End >= '20150518'] 

返回:

/Calendar[1]/Period[2] 

我要找的輸出是要麼開始值或位置:從我的例子「20150515」或2

的XML是從響應一個Web服務調用,所以我沒有訪問文件。

謝謝!

+0

考慮編輯您的問題,以包括我們所需的輸出。現在,我沒有看到/ Calendar [1]/Period [2]中的任何錯誤。祝你好運。 – shellter

+0

我已更新我的問題,以包含'20150515'或2的期望輸出。 –

回答

1

這裏有一半的答案,依託Ubuntu的xmllint

xmllint --xpath '/Calendar/Period[Start <= 20150518 and End >= 20150518]/Start/text()' 

回報

20150515 

但會有結尾沒有\n字符。這意味着你的CMD線會是什麼樣

20150515mPrompt > 

(另請注意,使用「//」在前面時,你實際上已經指定了一個完整路徑通常標記在SO由真實XMLSLT大師作爲計算昂貴的和不必要的。我已經切換到/Calendar/...。和日期值的報價是不需要的,所以只有20150518,不'20150518'需要(至少在xmllint)。

我已經花了太多的時間研究正確的語法來追加一個\n,但沒有找到它,我想這個行爲ior被認爲是XML-land中的一個特性。顯然唯一的解決方案是黑客。 IHMO,其中最簡單的理解就是

xmllint --xpath '/Calendar/Period[Start <= 20150518 and End >= 20150518]/Start' \ 
| sed '[email protected]<[/]*Start>@@g;s/$/\n/' 

產生

20150518 

(我在另外一臺機器和測試上寫這一點)。

最後,如果,答:你在* nix shell腳本環境中執行此操作,並且B以後要使用該值之一,該simpliest事情是使用CMD-替代捕捉值到一個shell變量,像

startDate=$(xmllint --xpath '/Calendar/Period[Start <= 20150518 and End >= 20150518]/Start/text()') 

echo "my StartDate = ${startDate}' 
my StartDate = 20150518 

至於回國的位置,我找不到一個在xmllint中工作的xpath函數。在XML Cheetsheet基礎的功能就行了,我本來期望

xmllint --xpath '/Calendar/Period[Start <= 20150518 and End >= 20150518]/Start/position()' 

工作,但只得到了

XPath error : Invalid expresion 
xmlpathEval : evaluation failed 
XPath evaluation failure 

其他都歡迎來解釋!

IHTH

+0

感謝您的詳細解釋!這很好。 –

-1

您可以使用XPath這個//Period[Start >= 20150501 and End <= 20150514]

給它一個去here

+0

這幾乎與提問者已有的功能相同。 –