XSLT에서 외부 함수 사용

외부 함수를 사용하는 XSLT 스타일시트를 사용하는 경우 XStaticContext 인스턴스를 사용하여 함수 서명을 선언하고 XDynamicContext 인스턴스를 사용하는 각 함수에 대해 Java 구현을 제공 또는 바인드합니다.

프로시저

  1. 외부 함수를 사용하는 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>&#xA;</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);
  2. 외부 함수를 사용하는 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());

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



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