2010-08-17 39 views
2

我有以下XML文件:迭代和CONCAT使用XPath表達式

<author> 
    <firstname>Akhilesh</firstname> 
    <lastname>Singh</lastname> 
</author> 
<author> 
    <firstname>Prassana</firstname> 
    <lastname>Nagaraj</lastname> 
</author> 

,我使用以下JXPath表達,

concat(author/firstName," ",author/lastName) 

要獲得Akhilesh Singh ,Prassana Nagaraj但 我只得到價值Akhilesh Singh

我的要求是我應該通過執行一個JXPath表達式來獲得兩個作者的價值。

+0

您可以發佈完整的XML? – YoK 2010-08-17 14:18:34

+0

好問題(+1)。查看我的答案以獲得單行XPath 2.0解決方案。 :) – 2010-08-17 16:27:46

回答

0

concat()將返回單個字符串。如果你想要兩個結果,那麼你需要遍歷「author」元素,並執行「concat(firstName," ",lastName)

+0

我試過,但它不工作 – 2010-08-18 10:33:52

+0

@Akhilesh庫馬爾singh你可以分享你的代碼是如何做到的嗎? – YoK 2010-08-18 10:45:40

3

使用XPath 1.0時,如果期望節點集以外的參數類型,則選擇節點集中的第一個節點,然後應用類型轉換(布爾類型轉換有些不同)。

所以,你expresion(注:沒有資本):

concat(author/firstname," ",author/lastname) 

這是一樣的:

concat(string((author/firstname)[1]), " ", string((author/lastname)[1])) 

根據宿主的語言,你可以使用:

author/firstname|author/lastname 

這被評估爲使用firstName和設置的節點按文檔順序排列,所以你可以遍歷這個提取字符串值的節點集。

在XPath 2.0可以使用:

string-join(author/concat(firstname,' ', lastname),' ,') 

輸出:

Akhilesh Singh ,Prassana Nagaraj 

注意:如今,隨着序列數據類型和函數調用的步驟,XPath的酷似它聲稱的功能性的語言成爲。高階函數和部分applycation必須等待XPath 2.1 ...

編輯:感謝Dimitre的評論,我已更正了字符串分隔符。

+0

+1爲好解釋。 – 2010-08-17 16:12:36

+0

查看我的答案以獲得更好的XPath 2.0單行程。 :) – 2010-08-17 16:28:20

+0

XPath 2.0表達式構造以「,」結尾的字符串,但OP不希望拖尾逗號。 – 2010-08-17 17:44:20

7

的XPath 2.0解決方案

/*/author/concat(firstname, ' ', lastname, following-sibling::author/string(', ')) 
+0

是的,只有在有後續兄弟'作者'的情況下才添加'',''。但是,你認爲這比'fn:string-join'更好嗎? – 2010-08-17 16:34:38

+1

@Alejandro:在詢問表現之前,請注意糾正您的答案 - OP希望*逗號分隔*,而不是* NL分隔*名稱。這裏棘手的部分是在姓氏後面不要有逗號。 – 2010-08-17 17:06:33

+0

+1兩次。你是對的!現在你提到,我看到了逗號。 – 2010-08-17 17:17:04