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

Xml 当输出不是序列时,名称(路径)和路径/名称()之间的差异,xml,xquery,xpath-2.0,Xml,Xquery,Xpath 2.0,Xquery之间的差异 name(/Data/element1/element2[@ID=$ID]), 及 当结果不是一个序列时,哪一个是最佳实践?(如果是,则前者基本上不能使用) 我忘记了什么,或者在那种情况下它们完全可以交换吗 在XPath 2.0中,如果name()函数的参数是包含多个项的序列,则此表达式会引发错误: name(/Data/element1/element2) /Data/element1/element2/name() 在XPath 1.0中,这不是错误,

Xquery之间的差异

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

当结果不是一个序列时,哪一个是最佳实践?(如果是,则前者基本上不能使用)


我忘记了什么,或者在那种情况下它们完全可以交换吗

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

name(/Data/element1/element2)
/Data/element1/element2/name()
在XPath 1.0中,这不是错误,
name()
使用节点集中的第一个节点作为参数

两者都同样无用,因为一眼就知道结果必须是
“element2”

如果结果不是序列(如果是, 那么前者基本上不能使用吗

在XPath 2.0/XQuery中,这两种情况都适用:

name(/Data/element1/element2)
/Data/element1/element2/name()

好的,区别在于没有区别,因为它是同一个函数,因为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)可能会更受欢迎,因为我们可以为我们的假设添加额外的验证步骤,但另一种方法的优点是,如果有一天,数据发生了变化,这是有效的,也是预期的

您对“结果在元素2中已知”部分的理解是正确的,我对示例做了一些修改,以获得想法。我的意思是动态选择,也许我做得太简单了