XPath에서 외부 변수 사용
외부 변수를 사용하는 XPath 표현식을 사용하는 경우 XDynamicContext 인스턴스를 사용하여 각 변수에 대한 값을 제공 또는 바인드하고 XStaticContext 인스턴스를 사용하여 변수의 유형을 선택적으로 선언하십시오.
프로시저
- 외부 변수를 사용하는 XPath 표현식을 준비하는 경우
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) 변수 값이 단일 노드이거나 원자 값 또는 노드의 시퀀스일 때 사용 다음 예제는 정적 컨텍스트에 2개를 선언하고 하나는 선언하지 않은 변수를 사용하는 XPath 표현식을 준비하는 방법을 보여줍니다.// Create the factory XFactory factory = XFactory.newInstance(); // Create a new static context from the factory XStaticContext staticContext = factory.newStaticContext(); // Define QNames for the names of the variables to be declared final QName taxRate = new QName("taxRate"); final QName partNumbers = new QName("partNumbers"); // Declare a variable called "taxRate" as an xs:float staticContext.declareVariable(taxRate, XTypeConstants.FLOAT_QNAME); // Obtain an XSequenceTypeFactory instance from the factory XSequenceTypeFactory typeFactory = factory.getSequenceTypeFactory(); // Define a sequence type for a sequence of xs:integer values XSequenceType integerSequence = typeFactory.atomic(XTypeConstants.INTEGER_QNAME, XSequenceType.OccurrenceIndicator.ZERO_OR_MORE); // Declare a variable called "partNumbers" as a sequence of xs:integer values staticContext.declareVariable(partNumbers, integerSequence); // Create an XPath expression that uses the declared variables, as well as another variable "discount" // that the processor will assume has type item()* String expression = "sum(for $partNumber in $partNumbers return /inventory/part[@num=$partNumber]/@price) * (1 - $discount) * (1 + $taxRate)"; // Prepare the XPath expression XPathExecutable xpath = factory.prepareXPath(expression, staticContext);
- 외부 변수를 사용하는 XPath 표현식을 실행하려면 XDynamicContext
인스턴스를 사용하여 각 변수에 대한 값을 제공 또는 바인드하십시오.
XPath 표현식을 실행할 때 사용된 변수에 대한 값을 제공하지 않으면 오류가 발생합니다.
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 인스턴스를 사용하여 생성하거나 다른 표현식을 실행한 결과일 수 있습니다.
다음 예제는 첫 번째 예제에서 준비한 XPath 표현식을 실행합니다. 이때, 먼저 사용하는 각 변수에 대한 값을 바인드합니다.// Create a new dynamic context from the factory XDynamicContext dynamicContext = factory.newDynamicContext(); // Bind an atomic value for the "taxRate" and "discount" variables dynamicContext.bind(taxRate, 0.13f); dynamicContext.bind(new QName("discount"), 0.40); // Bind a sequence of atomic values for the "partNumbers" variable dynamicContext.bindSequence(partNumbers, new int[] {2, 1, 2, 3, 2}); // Create an XML input document String xml = "<inventory>" + "<part num='1' price='9.99'/>" + "<part num='2' price='4.47'/>" + "<part num='3' price='12.99'/>" + "</inventory>"; StreamSource source = new StreamSource(new StringReader(xml)); // Execute the expression XSequenceCursor result = xpath.execute(source, dynamicContext);


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=txml_vars_xpath
파일 이름:txml_vars_xpath.html