J2EE 컨텍스트에서 분석기 사용

J2EE(Java™ 2 Platform, Enterprise Edition) 컨텍스트에서 아티팩트를 로드하는 경우 로컬 배치 아티팩트에서 자원을 로드할 때 적용하는 특별 함축 내용을 고려해야 합니다.

이 태스크 정보

J2EE 배치 아티팩트(EAR, WAR, 라이브러리 JAR 파일)에서 Class.getResource 및 Class.getResourceAsStream을 통해 로컬 자원을 로드하는 방법은 관련 XML 아티팩트를 로드할 때 문제가 생길 수 있습니다. 이러한 메커니즘을 사용하여 초기 로컬 자원을 로드하는 방법은 성공적이지만, 일반적으로 초기 자원에서 로드된 아티팩트는 특정 고려사항 없이는 로드에 실패합니다.

다음은 XPath fn:doc 함수를 사용하여 스타일시트에서 실행 시간에 문서를 로드하는 예제입니다. 이 경우 기본 동작은 정적 컨텍스트에서 기본 URI에 기반하여 문서를 분석하는 것입니다.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
  
	<xsl:variable name="names" select="doc('names.xml')"/>
	
	<xsl:template name="loadnames">
		<xsl:copy-of select="$names"/>
	</xsl:template>
	
</xsl:stylesheet>
J2EE 환경에서 다음 Java 코드로 로드된 경우:
// create the factory
XFactory factory = XFactory.newInstance();

// load the XSLT file from a local resource within a J2EE deployment artifact
StreamSource source = new StreamSource(XSLTDocFunction.class.getResourceAsStream("/samplexslts/doc.xsl"));

// Create an XSL transform executable
XSLTExecutable xslTransform = factory.prepareXSLT(source);
        
// Create the result
Result result = new StreamResult(new ByteArrayOutputStream());
        
// Create a dynamic context specifying the XSLT initial template
XDynamicContext dc = factory.newDynamicContext();
dc.setXSLTInitialTemplate(new QName("loadnames"));
        
// Execute the transformation
xslTransform.execute(dc, result);
다음 오류가 생성됩니다.
IXJXE0364W: FATAL ERROR:  IXJXE0774E: [ERR 0693][ERR FODC0005] 
The URI string 'names.xml' does not map to an available document.

이 오류의 이유는 초기 XML 아티팩트(doc.xsl)를 로드할 때 기본 URI에 대해 설정된 정적 컨텐츠가 없기 때문입니다. 이 경우 프로세서는 현재 작업 디렉토리에서의 검색으로 대체됩니다. 이 방법은 J2EE 환경에서 아무런 의미가 없습니다.

이 상황을 해결하는 세 가지 가능한 방법이 있습니다. 다음은 처음 두 가지 방법입니다.
  • 정적 컨텍스트에서 baseURI를 설정합니다.
    정적 컨텍스트에서 baseURI를 설정하도록 조정하는 방법은 다음 예제와 유사합니다.
    // create the factory
    XFactory factory = XFactory.newInstance();
            
    // set the baseURI in the static context
    URL dataURL = XSLTSchemaAware.class.getResource("/samplexslts/doc.xsl");
    XStaticContext staticContext = factory.newStaticContext();
    staticContext.setBaseURI(dataURL.toString());
    
    // load the XSLT file from a local resource within a J2EE deployment artifact        
    StreamSource source = new StreamSource(XSLTDocFunction.class.getResourceAsStream("/samplexslts/doc.xsl"));
    
    // Create an XSL transform executable
    XSLTExecutable xslTransform = factory.prepareXSLT(source, staticContext);
            
    // Create the result
    Result result = new StreamResult(new ByteArrayOutputStream());
    
    // Create a dynamic context specifying the XSLT initial template
    XDynamicContext dc = factory.newDynamicContext();
    dc.setXSLTInitialTemplate(new QName("loadnames"));
            
    // Execute the transformation
    xslTransform.execute(dc, result);
  • 프로세서에서 baseURI를 알 수 있도록 자원을 로드합니다.
    StreamSource 생성자로 절대 URL을 전달하여 프로세서에서 baseURI를 알 수 있도록 자원 로드를 조정하는 방법은 다음 예제와 유사합니다.
    // Create the factory
    XFactory factory = XFactory.newInstance();
            
    // Create the source from a URL
    URL dataURL = XSLTSchemaAware.class.getResource("/samplexslts/doc.xsl");
    StreamSource source = new StreamSource(dataURL.toString());
    
    // Create an XSL transform executable for the expression
    XSLTExecutable xslTransform = factory.prepareXSLT(source);
            
    // Create the result
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    Result result = new StreamResult(baos);
            
    // Create a dynamic context specifying the XSLT initial template
    XDynamicContext dc = factory.newDynamicContext();
    dc.setXSLTInitialTemplate(new QName("loadnames"));
            
    // Execute the transformation
    xslTransform.execute(dc, result);
설명한 이 두 가지 접근 방식은 모든 XML 아티팩트가 단일 J2EE 배치 단위에 있는 경우에 잘 작동합니다. 하지만, XML 아티팩트가 J2EE 배치 단위에서 분할된 경우에는 모든 XML 아티팩트에 대한 단일 baseURI가 없으므로 실패합니다.

여러 배치 단위에 분산된 아티팩트와 같은 경우를 지원하기 위해 XML 아티팩트 로드를 완전히 제어하려면 분석기를 사용하여 로드 동작을 완전히 제어하십시오.

프로시저

적절한 분석기를 구현하고 적절한 경우 정적 또는 동적 컨텍스트로 해당 분석기를 등록하십시오.

이러한 XML 아티팩트 로드 권장사항은 분석기에서 지원하는 모든 XML 아티팩트(예: XML 문서(fn:doc(), document()), 스타일시트(xsl:include, xsl:import), 구문 분석되지 않은 텍스트, XML 스키마(XSLT import-schema))에 대한 J2EE 컨텍스트 내에서 적용됩니다.


주제 유형을 표시하는 아이콘 태스크 주제



시간소인 아이콘 마지막 업데이트 날짜: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=txml_resolvers_j2ee
파일 이름:txml_resolvers_j2ee.html