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이 원자 외 유형을 참조하면 프로세서는 이를 유형 요소(*, ns:type)로 처리합니다. 여기서, ns:type은 지정된 QName입니다. XTypeConstants 인터페이스에서는 각 기본 유형에 대한 QName 오브젝트를 제공하는 편리한 상수가 사용 가능합니다.
declareVariable(QName name, XSequenceType type) 변수 값이 단일 노드이거나 원자 값 또는 노드의 시퀀스일 때 사용 또한 XQuery는 변수를 XQuery 표현식의 prolog에서 선언할 수 있습니다. 다음 XQuery 표현식은 두 개의 변수(하나는 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 메소드가 있습니다. 각각 2개의 매개변수가 있습니다. 첫 번째는 매개변수 이름에 대응하는 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