2012-03-24 3 views
4

Ant 1.8을 사용하여 폴더의 문서에서 일부 XSLT를 실행하고 있습니다. Ant는 Xalan을 사용하여 XSLT를 처리합니다. 작업이 잘 돌아가고, 입력 된 것들과 일치하는 변환 된 출력 파일들을 얻는다.Ant 또는 Jython에서 XSLT 확장을 만들 수 없습니다.

일부 까다로운 문자열을 처리하기 위해 Javascript 또는 Jython 함수로 XSL을 확장하려고 할 때 문제가 발생합니다. Javascript 나 Jython 중 어느 쪽이 먼저 작동하든, 어느 쪽이든 먼저 할 수는 있지만 그 순간도 마찬가지입니다.

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:jython-extension="http://www.jython.org/" 
xmlns:lxslt="http://xml.apache.org/xslt" 
xmlns:xalan="http://xml.apache.org/xalan" 
exclude-result-prefixes="lxslt xalan" 
xmlns:gotofritz="GotoFritz"> 

<xalan:component prefix="gotofritz" functions="test"> 
    <xalan:script lang="javascript"> 
    function test(){ 
     return '********* JS WORKS *******'; 
    } 
    </xalan:script> 
</xalan:component> 

<lxslt:component prefix="jython-extension" functions="test"> 
    <lxslt:script lang="jpython"> 
    def test(): 
     return "**** JYTHON WORKS ****" 
    </lxslt:script> 
</lxslt:component> 

<xsl:template match="/"> 
    <xsl:value-of select="gotofritz:test()"/> 
    <xsl:value-of select="jython-extension:test()"/> 
</xsl:template> 

</xsl:stylesheet> 

난에는/usr/share/개미/lib에 bsf.jar 및 javascript.har뿐만 아니라 최신의 Xalan 항아리 다운로드, 그들을 이동 한 - 나는 OS X의 오전

javscript가 "오류! 클래스 'GotoFritz'을 (를) 찾을 수 없습니다." 및 "오류! 외부 메서드 'GotoFritz.test'(공개해야 함)를 찾을 수 없습니다."

자이 썬이 으로 실패합니다. 경고! 'http://www.jython.org/ : 테스트'기능 호출을 해결할 수 없습니다.

java.lang.VerifyError: (class: test, method: template$dot$3 signature: (Lcom/sun/org/apache/xalan/internal/xsltc/DOM;Lcom/sun/org/apache/xml/internal/dtm/DTMAxisIterator;Lcom/sun/org/apache/xml/internal/serializer/SerializationHandler;I)V) Expecting to find integer on stack 
    at java.lang.Class.getDeclaredConstructors0(Native Method) 
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389) 
    at java.lang.Class.getConstructor0(Class.java:2699) 
    at java.lang.Class.newInstance0(Class.java:326) 
    at java.lang.Class.newInstance(Class.java:308) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.getTransletInstance(TemplatesImpl.java:353) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.newTransformer(TemplatesImpl.java:382) 
    at org.apache.tools.ant.taskdefs.optional.TraXLiaison.createTransformer(TraXLiaison.java:319) 
    at org.apache.tools.ant.taskdefs.optional.TraXLiaison.transform(TraXLiaison.java:177) 
    at org.apache.tools.ant.taskdefs.XSLTProcess.process(XSLTProcess.java:852) 
    at org.apache.tools.ant.taskdefs.XSLTProcess.execute(XSLTProcess.java:388) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.Target.execute(Target.java:390) 
    at org.apache.tools.ant.Target.performTasks(Target.java:411) 
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399) 
    at org.apache.tools.ant.Project.executeTarget(Project.java:1368) 
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 
    at org.apache.tools.ant.Project.executeTargets(Project.java:1251) 
    at org.apache.tools.ant.Main.runBuild(Main.java:809) 
    at org.apache.tools.ant.Main.startAnt(Main.java:217) 
    at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280) 
    at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109) 

나는 Xalan이 BSF를 사용하는 대신 Java로 확장을 모두 처리한다고 생각합니다. 어떤 아이디어? 미리 감사드립니다.

답변

3

이이 스타일 시트 (xalanext.xsl)를 사용하여 나를 위해 작동 : 여기

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xalan="http://xml.apache.org/xalan" 
       xmlns:js-extension="http://example.com" 
       xmlns:jython-extension="http://www.jython.org/" 
       exclude-result-prefixes="xalan js-extension jython-extension"> 

    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xalan:component prefix="js-extension" functions="test"> 
    <xalan:script lang="javascript"> 
     function test(){ 
     return '********* JS WORKS *******'; 
     } 
    </xalan:script> 
    </xalan:component> 

    <xalan:component prefix="jython-extension" functions="test"> 
    <xalan:script lang="jython"> 
def test(): 
    return "**** JYTHON WORKS ****" 
    </xalan:script> 
    </xalan:component> 

    <xsl:template match="/"> 
    <result> 
     <javascript><xsl:value-of select="js-extension:test()"/></javascript> 
     <jython><xsl:value-of select="jython-extension:test()"/></jython> 
    </result> 
    </xsl:template> 

</xsl:stylesheet> 

을 내 Ant 빌드 파일입니다

<project name="xalanext" default="runxslt"> 
    <path id="xslt.processor.classpath"> 
    <pathelement path="xalan.jar"/> 
    <pathelement path="bsf.jar"/> 
    <pathelement path="js.jar"/> 
    <pathelement path="jython.jar"/> 
    <pathelement path="commons-logging-1.0.4.jar"/> 
    </path> 

    <target name="runxslt"> 
    <xslt classpathref="xslt.processor.classpath" 
     in="test.xml" out="out.xml" 
     basedir="." destdir="." 
     extension=".xml" style="xalanext.xsl"> 
    </xslt> 
    </target> 
</project> 

test.xml의 작은 "더미"문서입니다은 단지 <root/>을 포함합니다. out.xml에

결과 출력 :

<result> 
<javascript>********* JS WORKS *******</javascript> 
<jython>**** JYTHON WORKS ****</jython> 
</result> 

코멘트 :

  • bsf.jar는 BSF 2.4.0에서이다. BSF 3.1에서 bsf-all-3.1.jar를 사용하면 org.apache.xalan.extensions.ObjectFactory$ConfigurationError: Provider org.apache.bsf.BSFManager not found이됩니다.
  • 자이 썬 스크립트 언어는 스타일 시트에 jython (이 아님 : jpython)으로 주어집니다.
  • test() 자이 썬 함수의 정의는 가장 왼쪽 열에서 시작됩니다. (자이 썬은 공백에 대해 까다 롭습니다.)
  • 자바 스크립트 구현이 필요합니다 ("javascript.har"라는 질문에 언급되어 있지만 그 내용을 알지 못합니다). js.jar에는 Rhino 엔진이 포함되어 있습니다. Rhino는 Oracle Java 1.6 이상에 번들로 제공되지만 js.jar이 classpath에 없으면 작동하지 않습니다.
  • java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory을 피하기 위해 클래스 경로에 commons-logging jar를 추가해야했습니다.
  • Xalan의 serializer.jar은 XSLT Error (java.lang.NoClassDefFoundError): org/apache/xml/serializer/ExtendedContentHandler을 피하기 위해 xalan.jar과 같은 디렉토리에 있어야합니다.
+0

괜찮아 보이는군요. 시험 해보고 고마워요. 고마워요! – gotofritz