XSLT에서 외부 함수 사용
외부 함수를 사용하는 XSLT 스타일시트를 사용하는 경우 XStaticContext 인스턴스를 사용하여 함수 서명을 선언하고 XDynamicContext 인스턴스를 사용하는 각 함수에 대해 Java 구현을 제공 또는 바인드합니다.
프로시저
- 외부 함수를 사용하는 XSLT 스타일시트를 사용하는 경우
XStaticContext 인스턴스를 사용하여 함수 서명을 선언하십시오.
XStaticContext 인터페이스에는 각각 세 개의 매개변수(각각 이름, 함수의 리턴 유형, 인수 유형에 대한 배열)를 사용하는 2개의 declareFunction 메소드가 있습니다. 이름은 항상 QName 오브젝트로 제공되지만, 유형은 QNames 또는 XSequenceTypes일 수 있습니다. 함수 이름, 리턴 유형, 인수 유형은 함수를 고유하게 식별해야 합니다.
스타일시트 함수는 외부 함수와 동일한 이름을 보유할 수 있습니다. 스타일시트 함수에 값이 yes인 대체 속성이 있는 경우 스타일시트에서 해당 함수 이름에 대한 참조는 스타일시트 함수에 대한 참조입니다. 값이 no인 대체 속성이 있는 경우 이는 외부 함수에 대한 참조입니다.
표 1. XStaticContext declareFunction 메소드. 다음 표는 declareFunction 메소드의 각 양식을 사용할 시점을 설명합니다.
메소드 서명 목적 declareFunction(QName name, QName type, QName[] argTypes) 함수의 리턴값 및 인수가 모두 단일 원자 값인 경우 사용 QNames 유형은 XStaticContext 인스턴스를 작성하기 위해 사용되는 XFactory 인스턴스에 등록된 스키마에 선언된 기본 유형 또는 글로벌 유형을 참조해야 합니다. QName이 원자 외 유형을 참조하면 프로세서는 이를 유형 요소(*, ns:type)로 처리합니다. 여기서, ns:type은 지정된 QName입니다. XTypeConstants 인터페이스에서는 각 기본 유형에 대한 QName 오브젝트를 제공하는 편리한 상수가 사용 가능합니다.
declareFunction(QName name, XSequenceType type, XSequenceType[] argTypes) 함수의 인수 또는 리턴값이 노드이거나 원자 값 또는 노드의 시퀀스일 때 사용 다음 스타일시트는 QName ext:pow로 참조하는 외부 함수를 사용합니다.<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="http://www.example.com/functions" version="2.0"> <xsl:output method="text"/> <xsl:template match="polynomial"> <xsl:variable name="p" select="."/> <xsl:for-each select="1 to 5"> <xsl:text>x = </xsl:text> <xsl:value-of select="."/> <xsl:text>; </xsl:text> <xsl:value-of select="for $t in $p/term return concat($t/@coefficient, 'x^', $t/@power)" separator=" + "/> <xsl:text> = </xsl:text> <xsl:value-of select="sum($p/term/(ext:pow(current(), @power) * @coefficient))"/> <xsl:text>
</xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet>
지정된 스타일시트는 xsltSource 소스 오브젝트를 통해 사용 가능하다고 가정하고 다음 코드는 스타일시트를 준비합니다.// Create the factory XFactory factory = XFactory.newInstance(); // Create a new static context XStaticContext staticContext = factory.newStaticContext(); // Declare a namespace for the function staticContext.declareNamespace("ext", "http://www.example.com/functions"); // Create a QName for the name of the function QName methodQName = new QName("http://www.example.com/functions", "pow"); // Declare the function on the static context staticContext.declareFunction(methodQName, XTypeConstants.DOUBLE_QNAME, new QName[]{XTypeConstants.DOUBLE_QNAME, XTypeConstants.DOUBLE_QNAME}); // Create an XSLT executable for the stylesheet XSLTExecutable executable = factory.prepareXSLT(xsltSource, staticContext);
- 외부 함수를 사용하는 XSLT 스타일시트를 실행하려면 XDynamicContext
인스턴스를 사용하여 함수를 구현하는 Java 메소드를 제공 또는 바인드하십시오.
Java 리플렉션을 사용하여 함수에 대한 java.lang.reflect.Method 오브젝트를 확보하십시오. 메소드가 인스턴스 메소드인 경우 이 함수를 바인드할 때 인스턴스 오브젝트가 필요합니다.
XSLT 스타일시트를 실행할 때 사용된 함수에 대한 Java 메소드를 제공하지 않으면 오류가 발생합니다.
XDynamicContext에는 두 개의 bindFunction 메소드가 있습니다. 각각에는 함수에 대한 구현을 제공할 Java 메소드를 식별하는 메소드 오브젝트 및 함수 이름에 대응하는 QName 오브젝트가 필요합니다.표 2. XDynamicContext bindFunction 메소드. 다음 표는 XDynamicContext bindFunction 메소드의 각 양식을 사용할 시점을 설명합니다.
메소드 이름 목적 bindFunction(QName qname, Method method) 정적 메소드를 바인드하는 경우 사용 bindFunction(QName qname, Method method, Object instanceObject) 인스턴스 메소드를 바인드하는 경우 사용 다음 예제는 첫 번째 예제에서 준비한 XSLT 스타일시트를 실행합니다. 이때, 먼저 사용하는 함수에 대한 메소드를 바인드합니다. 이 예제에서 java.lang.Math 클래스의 static pow(double a, double b) 메소드는 외부 함수의 구현을 제공하는 데 사용됩니다.// Create a new dynamic context XDynamicContext dynamicContext = factory.newDynamicContext(); // Retrieve the java.lang.reflect.Method object for this function Method method = Math.class.getMethod("pow", Double.TYPE, Double.TYPE); // Bind the function to the dynamic context dynamicContext.bindFunction(methodQName, method); // Create an XML input document String xml = "<polynomial>" + "<term power='2' coefficient='3'/>" + "<term power='1' coefficient='-2'/>" + "<term power='0' coefficient='1'/>" + "</polynomial>"; StreamSource source = new StreamSource(new StringReader(xml)); // Execute the stylesheet XSequenceCursor result = executable.execute(source, dynamicContext); // Serialize the result to System.out result.exportItem(new StreamResult(System.out), executable.getOutputParameters());
하위 주제
XSLT에서 스타일시트 선언 외부 함수 사용
API를 사용하는 스타일시트에서 함수에 Java 메소드를 바인드하는 방법의 대안으로, Java 외부 함수를 스타일시트에서 직접 선언할 수 있습니다. 스타일시트 실행 중 클래스 경로에 바인드된 Java 클래스를 존재하게 하려는 경우 하나의 추가 구성만 필요합니다.


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