결과 보기
애플리케이션이 XPath 표현식(XPathExecutable 오브젝트), XSLT 스타일시트(XSLTExecutable 오브젝트) 또는 XQuery 표현식(XQueryExecutable 오브젝트)에 대한 XExecutable 오브젝트를 준비하거나 로드하는 경우 일부 입력에 XExecutable 오브젝트를 적용한 후 결과에 대한 작업을 수행합니다. 제공하는 입력 소스 및 결과를 통해 수행하려는 작업은 사용하는 실행 메소드를 판별합니다.
프로시저
- XPath 결과를 보십시오.
XPath 표현식의 경우 XPathExecutable 인터페이스의 실행 메소드는 지정된 컨텍스트 항목 및 동적 컨텍스트(있는 경우)를 통해 표현식을 평가하게 되는 시퀀스를 포함하는 XSequenceCursor 클래스의 인스턴스를 리턴합니다.
또한 XPathExecutable 인터페이스의 executeToList 메소드 세트도 있습니다. 이 메소드는 java.util.List<XItemView> 인터페이스의 인스턴스로 시퀀스를 리턴합니다. 이 경우 XPath 표현식을 평가하게 되는 시퀀스의 각 항목은 XItemView 인터페이스의 인스턴스로 목록에 표시됩니다. 이 목록의 항목은 XPath 표현식을 평가한 결과 생성되는 시퀀스에서 순서가 동일합니다.
다음 예제는 구매 주문의 각 항목 비용을 XSequenceCursor로 가져오는 방법을 보여줍니다.XFactory factory = XFactory.newInstance(); XPathExecutable expr = factory.prepareXPath( "/purchaseOrder/item/(@unit-price * @quantity)"); XSequenceCursor exprResult = expr.execute(new StreamSource("input.xml"));
다음 예제는 java.util.List 인터페이스의 인스턴스에서 구매 주문에 있는 각 항목의 비용을 가져오는 방법을 보여줍니다.XFactory factory = XFactory.newInstance(); XPathExecutable expr = factory.prepareXPath( "/purchaseOrder/item/(@unit-price * @quantity)"); List<XItemView> exprResult = expr.executeToList(new StreamSource("input.xml"));
- XItemView 인터페이스를 사용하십시오.
XItemView 인터페이스에서 메소드를 사용하여 순차적으로 각 항목에 액세스할 수 있습니다. 항목이 원자 값 또는 노드인지 판별하기 위해 XItemView.isAtomic() 메소드를 사용할 수 있습니다. 항목이 원자 값인 경우 XItemView 인터페이스에서 getValueType() 메소드를 사용할 수 있습니다. 이 메소드는 열거된 유형 XTypeConstants.Type의 인스턴스를 리턴합니다. 원자 값이 기본 원자 유형 또는 기본 원자 유형에서 파생된 사용자 정의 유형의 인스턴스인 경우 getValueType() 메소드의 결과는 해당 유형에 대응하는 열거된 값입니다. 사용자 정의 파생 유형일 수 있는 원자 값의 경우 XItemView.getValueTypeName() 메소드를 사용하여 값의 정확한 유형을 판별하는 방법이 편리할 수도 있습니다.
원자 값 유형의 경우 적절한 메소드를 사용하여 값을 얻을 수 있습니다.XFactory factory = XFactory.newInstance(); XPathExecutable expr = factory.prepareXPath( "sum(/purchaseOrder/item/(@unit-price * @quantity))"); XItemView exprResult = expr.execute(new StreamSource(purchaseOrder)); double totalCost = 0.0; // Decide how to get result based on the type of the value switch (exprResult.getValueType()) { case DOUBLE: { totalCost = exprResult.getDoubleValue(); break; } case FLOAT: { totalCost = exprResult.getFloatValue(); break; } case INTEGER: { totalCost = exprResult.getLongValue(); break; } case DECIMAL: { totalCost = exprResult.getDecimalValue().doubleValue(); break; } default: { System.err.println("Unexpected type for result"); } }
또한 XItemView 인터페이스는 XNodeView 인터페이스도 확장합니다. 따라서 XItemView.isAtomic() 메소드 호출 결과가 false인 경우(즉, 항목이 노드임) XNodeView 인터페이스에서 상속된 메소드를 사용하여 노드에 대한 정보에 액세스할 수 있습니다. XNodeView.getNodeQName() 메소드는 노드 이름을 리턴하고 XNodeView.getKind() 메소드는 열거된 유형 XNodeView.Kind의 값을 리턴하여 항목의 노드 종류를 표시합니다(XNodeView.DOCUMENT, XNodeView.ELEMENT 등).XFactory factory = XFactory.newInstance(); // Prepare an expression to get the first node whose string value matches a given query string XPathExecutable expr = factory.prepareXPath( "(/descendant-or-self::node()/(self::node()|@*)[. = 'search'])[1]"); XItemView exprResult = expr.execute(new StreamSource(inputFile)); // Print the kind of node found and its name, if appropriate switch (exprResult.getKind()) { case ELEMENT: { System.out.print("Element " + exprResult.getNodeQName().toString()); break; } case ATTRIBUTE: { System.out.print("Attribute " + exprResult.getNodeQName().toString()); break; } case COMMENT: { System.out.print("Comment "); break; } case PROCESSING_INSTRUCTION: { System.out.print("PI " + exprResult.getNodeQName().toString()); } }
또한 XTreeCursor 인터페이스를 사용하는 노드를 포함하는 트리를 탐색할 수도 있습니다.
- XSLT 및 XQuery 결과를 보십시오.
XPathExecutable 인터페이스에서 사용 가능한 모든 execute 및 executeToList 메소드는 실제로 XExecutable 인터페이스에서 상속되므로, XSLTExecutable 인터페이스 또는 XQueryExecutable 인터페이스의 인스턴스에서 사용할 수 있습니다. XQueryExecutable 인터페이스의 인스턴스인 경우 메소드가 리턴하는 오브젝트는 조회를 평가하게 되는 시퀀스를 포함합니다. XSLTExecutable 인터페이스의 경우 시퀀스는 스타일 시트를 평가하는 1차 결과의 문서 노드(있는 경우)를 포함합니다.
또한 XSLTExecutable 및 XQueryExecutable 인터페이스는 javax.xml.transform.Result 인터페이스의 인스턴스를 승인하는 실행 메소드도 정의합니다. 애플리케이션이 제공하는 결과 오브젝트는 XSLTExecutable 인터페이스의 경우 스타일시트 평가의 1차 결과 또는 XQueryExecutable의 경우 조회 평가 결과를 포함합니다.
다음 예제에서는 변환 결과로 DOM 트리를 생성하고, XSLTExecutable.execute 메소드에 대한 인수로 전달되는 DOMResult 클래스의 인스턴스에 트리를 저장합니다.XFactory factory = XFactory.newInstance(); XSLTExecutable style = factory.prepareXSLT(new StreamSource("style.xsl")); DOMResult res = new DOMResult(); style.execute(new StreamSource("purchase.xml"), res); Node node = res.getNode();
다음 예제는 변환 결과로 XSequenceCursor 인터페이스의 인스턴스를 생성합니다.XFactory factory = XFactory.newInstance(); XSLTExecutable style = factory.prepareXSLT(new StreamSource("style.xsl")); XSequenceCursor xformResult = style.execute(new StreamSource("purchase.xml"));
- XResultResolver 및 XSLT를 사용하십시오.
XSLT 2.0 스타일시트는 xsl:result-document 명령어를 사용하여 둘 이상의 결과 문서를 생성할 수 있습니다. 변환의 1차 결과는 xsl:result-document 명령어에 포함되지 않거나 유효 값이 길이 0의 문자열인 href 속성이 있는 xsl:result-document 명령어에 포함된, 스타일시트가 구성하는 결과 트리에 대해 생성됩니다. 1차 결과는 이전에 설명한 다양한 방법을 통해 애플리케이션으로 리턴됩니다.
스타일시트가 유효 값이 길이가 0인 문자열이 아닌 href 속성을 포함하는 xsl:result-document 명령어를 평가하는 경우 기본적으로 해당 결과는 출력 스트림에 작성됩니다. 출력 스트림의 URI는 동적 컨텍스트에서 기본 출력 URI의 설정에 대해 href 속성의 유효 값을 분석하여 판별됩니다.
변환에 대해 사용하는 XDynamicContext에서 XResultResolver 인터페이스의 인스턴스를 제공하여 이 기본 동작을 대체할 수 있습니다. XResultResolver 인터페이스에서 getResult 메소드는 xsl:result-document 명령어를 호출하는 경우 호출됩니다. getResult 메소드의 결과는 xsl:result-document 명령어의 결과가 지정되는 Result 인터페이스의 인스턴스입니다. XResultResolver 인터페이스를 사용하는 경우 애플리케이션은 스타일시트에서 모든 xsl:result-document 명령어의 결과를 지정하는 위치를 케이스별 기반으로 결정할 수 있습니다. 애플리케이션이 XSLTExecutable 인터페이스의 실행 메소드에서 1차 결과에 대한 Result 인터페이스의 인스턴스를 제공하지 않으면 1차 결과에 대해 XResultResolver의 getResult 메소드도 호출됩니다.
XResultResolver의 getResult 메소드가 널 참조를 리턴하는 경우 기본 동작은 특정 결과에 대해 저장됩니다. 즉, 결과는 2차 결과의 경우 출력 스트림에 작성되거나 1차 결과의 경우 XSequenceCursor 인터페이스의 인스턴스로 실행 메소드 결과에서 리턴됩니다.
다음 예제는 XResultResolver 인터페이스의 인스턴스를 사용하여 변수 allResults에서 XSequenceCursorResult 클래스의 인스턴스로 스타일시트에서 생성하는 모든 결과를 캡처합니다. 그러면 애플리케이션은 XSequenceCursorResult.getSequenceCursor() 메소드를 사용하여 XSequenceCursorResult 클래스의 각 인스턴스가 포함하는 XSequenceCursor 인터페이스의 인스턴스를 추출할 수 있습니다.
final ArrayList<XSequenceCursorResult> allResults = new ArrayList<XSequenceCursorResult>(); XFactory factory = XFactory.newInstance(); XDynamicContext context = factory.newDynamicContext(); // Create XResultResolver that saves XSequenceCursorResult // instances in allResults context.setResultResolver(new XResultResolver() { public Result getResult(String href, String base) { XSequenceCursorResult result = new XSequenceCursorResult(); allResults.add(result); return result; } }); XSLTExecutable style = factory.prepareXSLT(new StreamSource("style.xsl")); style.execute(new StreamSource("purchase.xml"), context); // All results, including the primary, are now available from the allResults variable.


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