2012-02-21 3 views
3

Java에서 XSLT 변환을 수행하려고합니다.중괄호로 변수를 참조하는 스타일 시트가 컴파일되지 않습니다.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="person"> 
     <xsl:variable name="varname">info</xsl:variable> 
     <xsl:element name="{$varname}">content</xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

(그것은 문제를 보여주는 아주 간단한 예입니다 사실, 난 정말 변수를 정의하고이를 사용할 필요가있다.) 다음은 스타일 시트입니다.

ERROR: 'Variable or parameter 'varname' is undefined.' 
FATAL ERROR: 'Could not compile stylesheet' 
javax.xml.transform.TransformerConfigurationException: Could not compile stylesheet 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:824) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:619) 

같은 스타일은 GNU에서, MSXML에서 Internet Explorer에서 (다른 엔진에서 잘 작동합니다

DocumentBuilder builder=DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
Document doc=builder.parse(new File("C:\\temp\\test.xsl")); 
DOMSource xsl=new DOMSource(doc); 
Transformer transformer=TransformerFactory.newInstance().newTransformer(xsl); 

실행, 예외를 방출 : 여기

는 자바 코드 xsltproc). 내가 도대체 ​​뭘 잘못하고있는 겁니까? 이 기능은 Java에서 지원되지 않을 수 있습니까? 아니면 먼저 TransformerFactory에 매개 변수를 설정해야합니까?

+0

내가 재현 할 수없는이 JDK 1.6.0_26, 어느와 함께 사용하여 내장의 Xalan 버전도 있습니다 버전의 Xalan 2.7.1로 너 사용? 어쩌면 당신은 당신의'MyXMLReader' 클래스의 관련 소스를 포함시킬 수도 있습니다. –

+0

@ Jörn, JDK 1.6.0_24 (64 비트)를 사용하고 있습니다. JDK 1.5에서도 스택 추적의 행 번호 만 다른 동일한 결과가 나타납니다. –

+0

나는'MyXMLReader'를 표준 클래스'DocumentBuilderFactory'로 대체하면서 질문을 편집했습니다. 오류는 여전히 동일합니다. –

답변

2

오류 메시지가 완전히 오도하지 않는 것 같습니다. 실제 문제는 DocumentBuilder이 네임 스페이스를 인식하도록 구성되지 않았으므로 xsl:variable 선언을 인식하지 못한다는 것입니다. 파서는 어떻게 든 중괄호로 표현을 인식합니다. 당신은 DocumentBuilderFactory에 파싱 인식 네임 스페이스를 활성화하여 문제를 해결할 수 :

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
Document doc = db.parse(new File("C:\\temp\\test.xsl")); 
+0

그것은 작동합니다! Jörn에게 감사드립니다! 나는 그런 것을 의심했다. –

관련 문제