当输出不是序列时,名称(路径)和路径/名称()之间的差异

时间:2012-07-16 13:44:20

标签: xml xquery xpath-2.0

Xquery的区别

    name(/Data/element1/element2[@ID=$ID]), 

    /Data/element1/element2[@ID=$ID]/name()

当结果不是序列时,哪种是最佳做法? (如果是,那么前者基本上不能使用)

我忘记了什么,或者在那种情况下他们完全可以互换?

2 个答案:

答案 0 :(得分:1)

在XPath 2.0中,如果name()函数的参数是包含多个项目的序列,则此表达式会引发错误:

name(/Data/element1/element2)

在XPath 1.0中,这不是错误name()将其作为参数用作节点集中的第一个节点。

两者同样毫无用处,因为一眼就知道结果必须是"element2"

  

当结果不是序列时,哪种是最佳实践(如果是,   然后前者基本上不能使用了吗?

这适用于XPath 2.0 / XQuery中的两种情况

/Data/element1/element2/name()

答案 1 :(得分:1)

好的区别在于没有区别,因为它是相同的函数,因为name()等于name(。),所以它不是一个不同的语法。它发生的是名称(X)应该包含一个不超过1次输出的表达式。

所以我们可以使用:

/Data/name(./element1/element2) = /Data/name(element1/element2) 
 * element2, if a single occurrence in the whole data

/Data/element1/name(./element2) = /Data/element1/name(element2)
 * element2, if a single occurrence per any element1, for each element1

/Data/element1/element2/name() = /Data/element1/element2/name(.)
 * element2, no matter num of occurrences, we print them all 

因此,当我们只期望一次出现时,name(complete_expression)可能会受到青睐,因为我们可以为我们的假设添加额外的验证步骤,但替代方案还有一个强点,即我们可以准备地形来处理多个输入。表达式(数组),如果某天数据发生变化且有效且预期