2012-08-29 3 views
2

나는 이상한 문제가있어서 해결책을 찾지 못하는 것 같습니다. XML 파일에 XSLT 스타일 시트를 적용하려고합니다 (이 경우 XML로 형식이 지정된 SPARQL 쿼리 결과이지만 다른 XML 파일도 동일한 결과를 제공합니다). 이 경우 DOMSource를 통해 이미로드 된 XML 문서를 다시 사용하여 변환기를 만들어야합니다.DOMSource를 통해 JAXP Transformer가 스타일 시트를 반환합니다.

대신 변환 된 XML의
TransformerFactory factory = TransformerFactory.newInstance(); 
Document stylesheet = db.parse(new File("C:/workspace_5/stylesheet.xml")); 
Transformer xformer = factory.newTransformer(new DOMSource(stylesheet)); 

Source source = new StreamSource(new FileInputStream("C:/workspace_5/xml-file.xml"));   
ByteArrayOutputStream bOut = new ByteArrayOutputStream(); 
Result result = new StreamResult(bOut); 

xformer.transform(source, result); 

의 StreamResult의 OutputStream에로드 된 스타일 시트를 반환합니다 (일반적으로, 스타일 시트 문서는 다른 곳에서 오는 간체) 아래의 코드를 찾을 수 있습니다. 두 번째 줄과 세 번째 줄을 다음과 같이 바꿉니다 :

Transformer xformer = factory.newTransformer(new StreamSource(
    new FileInputStream(""C:/workspace_5/stylesheet.xml"))); 

그러면 모든 것이 잘 작동합니다. 그리고 네, 물론로드 된 스타일 시트 문서를 문자열로 직렬화하고, ByteArrayInputStream (또는 더 나쁜 것은 파일에 쓰십시오)으로 변환 한 다음이를 사용하여 StreamSource를 만들 수 있습니다.하지만 그건 바보입니다.

이것이 작동하지 않는 이유가 있을까요?

는 XML-file.xml 코드 :

<?xml version="1.0"?> 
<sparql> 
    <head> 
    <variable name="buyerName"/> 
    </head> 
    <results> 
    <result> 
     <binding name="buyerName"> 
     <literal>John Doe</literal> 
     </binding> 
    </result> 
    </results> 
</sparql> 

stylesheet.xml 코드 :

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:po="http://www.w3.org/2002/ws/sawsdl/spec/wsdl/order#" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

<xsl:template match="/sparql"> 
    <xsl:for-each select="results/result"> 

     <buyer xsi:type="po:Buyer"> 
      <name xsi:type="string"><xsl:value-of select="binding[@name='buyerName']/literal" /></name> 
     </buyer> 

    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

감사합니다!

윌리엄

+0

자, 이건 성숙한 기술이라고 생각합니다. 아무도 지식이나 경험이 없습니까? :-( –

답변

2

DocumentBuilderFactory는 네임 스페이스를 인식하지 못할 가능성이 큽니다. 와 공간 인식에 켜보십시오 : 관련 코드에 대한

factory.setNamespaceAware(true); 

할 수 있습니다 check out this post합니다.

+0

당신은이 답변으로 내 문제를 정확히 해결 했으므로 2 년 전에 받아야 할 크레딧을드립니다. 감사합니다 @C. Trimble! –