将外部变量用于 XQuery
使用 XQuery 表达式(使用外部变量)时,使用 XDynamicContext 实例为每个变量提供(绑定)值,并可以选择使用 XStaticContext 实例声明变量的类型。
过程
- 准备使用外部变量的 XQuery 表达式时,使用 XStaticContext 实例声明变量的类型。
XStaticContext 中声明的变量仅对于主模块可见。要使外部变量对于库模块可见,必须使用外部变量声明在该库模块的 Prolog 中声明此外部变量。
是否在 XStaticContext 中声明变量是可选的。如果未声明变量,那么处理器会假定其类型为 item()*。换言之,变量的值可以为包含任何类型的项的任何长度序列。声明变量的类型可帮助处理器在准备期间静态检测某些使用错误。
XStaticContext 接口具有两种 declareVariable 方法,每种方法具有两个参数,一个参数对应名称,一个参数对应变量类型。始终将名称作为 QName 对象提供,但类型可以为 QName 或 XSequenceType。表 1. XStaticContext declareVariable 方法. 下表说明何时使用各种格式的 declareVariable 方法。
方法特征符 用途 declareVariable(QName name, QName type) 用于变量的值为单个原子值的情况 QName 必须引用模式中声明的内置类型或全局类型,此模式已在用于创建 XStaticContext 实例的 XFactory 实例上注册。如果 QName 引用非原子类型,那么处理器会将变量视为具有类型 element(*, ns:type),其中 ns:type 是给定的 QName。XTypeConstants 接口具有可用的方便常量,这些常量为各种内置类型提供 QName 对象。
declareVariable(QName name, XSequenceType type) 用于在变量的值为单个节点、原子值序列或节点序列的情况 XQuery 还允许在 XQuery 表达式的 Prolog 中声明变量。以下 XQuery 表达式使用两个变量,一个变量在 Prolog 中声明,一个变量未在 Prolog 中声明。
未在 XQuery 表达式自身中声明的变量可以选择使用 XStaticContext 实例进行声明,从而为处理器提供类型信息。declare namespace xs = "http://www.w3.org/2001/XMLSchema"; declare variable $searchTerms as xs:string+ external; <table> <tr><td>Title</td><td>Author</td></tr> { for $book in /library/book let $value := $book/@*[local-name()=$searchField] where exists(for $term in $searchTerms return if (contains($value, $term)) then true() else ()) return <tr> <td>{ string($book/@title) }</td> <td>{ string($book/@author) }</td> </tr> } </table>
以下示例说明如何准备前一 XQuery 表达式,为 XQuery 表达式中未声明的变量提供类型。假定使用 xquerySource 源对象可访问该表达式。// Create the factory XFactory factory = XFactory.newInstance(); // Create a new static context from the factory XStaticContext staticContext = factory.newStaticContext(); // Define a QName for the name of the variable to be declared final QName searchField = new QName("searchField"); // Declare a variable called "searchField" as an xs:string staticContext.declareVariable(searchField, XTypeConstants.STRING_QNAME); // Prepare the XQuery expression XQueryExecutable xquery = factory.prepareXQuery(xquerySource, staticContext);
- 要执行使用外部变量的 XQuery 表达式,请使用 XDynamicContext 实例提供(或绑定)每个变量的值。
外部变量的绑定将可用于主模块和任何库模块,这些库模块在此变量的 Prolog 中具有外部变量声明。
如果没有为执行 XQuery 表达式时使用的变量提供值,那么会发生错误。
XDynamicContext 具有若干 bind、bindItem 和 bindSequence 方法。每个方法都有两个参数,其中第一个参数是对应于参数名称的 QName 对象,第二个参数是值。表 2. XDynamicContext bind、bindItem 和 bindSequence 方法. 下表说明何时使用各种格式的 XDynamicContext bind、bindItem 和 bindSequence 方法。
方法 用途 bind 在绑定单个原子值时使用 对于内置类型到 Java™ 类型的标准映射中使用的每种 Java 类型,都存在一种格式的此方法。还具有两种其他格式,一种格式采用节点,一种格式采用源。这两种格式分别用于从 DOM 树绑定任何节点以及解析新的源代码以生成文档节点。
bindItem 在将单个项作为 XItemView 对象绑定时使用 XItemView 对象可以通过执行其他表达式获得,也可以使用 XItemFactory 实例来构造。
bindSequence 在绑定少于一个项或多于一个项的序列时使用 对于内置类型到 Java 类型的标准映射中使用的每种 Java 类型,都存在一种格式的此方法;每个方法都接受给定类型的值数组。
还存在另一种接受 XSequenceCursor 的格式。XSequenceCursor 可以通过执行其他表达式来生成,也可以使用 XItemFactory 实例来构造。
以下示例执行第一个示例中准备的 XQuery 表达式,同时首先绑定它所使用的各个变量的值。// Create a new dynamic context from the factory XDynamicContext dynamicContext = factory.newDynamicContext(); // Bind an atomic value for the "searchField" variable dynamicContext.bind(searchField, "title"); // Bind a sequence of atomic values for the "searchTerms" variable dynamicContext.bindSequence(new QName("searchTerms"), new String[] {"Lost", "Gables"}); // Create an XML input document String xml = "<library>" + "<book title='Lost in the Barrens' author='Farley Mowat'/>" + "<book title='Anne of Green Gables' author='L. M. Montgomery'/>" + "</library>"; StreamSource source = new StreamSource(new StringReader(xml)); // Execute the expression XSequenceCursor result = xquery.execute(source, dynamicContext);


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=txml_vars_xquery
文件名:txml_vars_xquery.html