数据模型是查询语言的基础。XQuery数据模型定义了包含在XSLT或XQuery处理器输入中的信息,以及所有被允许出现在XSLT、XQuery、XPath表达式中的值。也就是说,XQuery数据模型规定了文档中什么样的信息可以被XML查询语言访问并处理。XQuery数据模型包含下面这些重要的值:
原子值(atomic value):一个原子值封装了一个XML Schema原子类型以及符合该类型一个值。
节点(Node):节点是数据模型的核心概念。XQuery数据模型定义了7 种类型的节点,分别是:Document、Element、Attribute、Namespace、Processing Instruction、Comment、Text。此外,还定义了构造和访问节点的函数。constructor(构造器)类函数用于创建节点,而访问节点结构的函数被称为accessor(访问器)。节点的类型值(type)是零个或多个原子值的序列,节点的字符串值(string)是类型xs:string的一个值,节点的名称(name)是类型xs:QName的一个值。
序列(Sequence):一个序列是零个或多个项(item)构成的有序集合,而一个项既可以是一个节点,也可以是一个原子值。从数据模型的角度来看,只包含一个原子值的序列和原子值本身没有区别。
图1是一个XML文档示例及其数据模型的图形表示。
其中,D1表示文档(document)节点,E1、E2表示元素(element)节点,A1表示属性(Attribute)节点,T1、T2、T3代表文本(Text)节点。
下面,使用XQuery数据模型的构造器和访问器函数来表现上面的XML文档(这里,假定与该文档相关联的URI为“http://www.mytest.com/query/test.xml”)。
//文档节点D1
dm:base-uri(D1) = xf:anyURI("http://www.mytest.com/xquery/test.xml")
dm:string-value(D1) = xf:string("/n Java Core/n")
dm:children(D1) = E1
//元素节点 E1
dm:name(E1) = xf:string("book")
dm:base-uri(E1) = xf:anyURI("http://www.mytest.com/xquery/test.xml")
dm:string-value(E1) = xf:string("/n Java Core/n")
dm:parent(E1) = D1
dm:children(E1) = (T1,E2,T3)
dm:attribute(E1) = A1
//元素节点E2
dm:name(E2) = xf:string("title")
dm:base-uri(E2) = xf:anyURI("http://www.mytest.com/xquery/test.xml")
dm:string-value(E2) = xf:string("Java Core")
dm:typed-value(E2) = xf:string("Java Core")
dm:parent(E2) = E1
dm:children(E2) = T2
dm:attribute(E2) = ()
//属性节点A1
dm:name(A1) = xf:Qname("year")
dm:string-value(A1) = xf:string("2002")
dm:typed-value(A1) =
dm:parent(A1) = E1
//文本节点T1
dm:string-value(T1) = xf:string("/n ")
dm:parent(T1) = E1
//文本节点T2
dm:string-value(T2) = xf:string("Java Core")
dm:parent(T2) = E2
//文本节点T3
dm:string-value(T3) = xf:string("/n ")
dm:parent(T3) = E1