2010-08-17 95 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