2016-09-01 5 views
0

XSLT의 Java 맵에서 데이터를 가져 오는 요구 사항이 있습니다. xalan을 사용하여 구현할 수 있지만 Saxon-HE를 사용해야하는 일반적인 Transformer에 대한 의존성이 있습니다. 변수에 java 맵을 전달하고 XSLT로 가져옵니다. 우리가 어떻게 성취 할 수 있는지 조언 해주십시오.xslt에서 Java 맵에서 데이터를 가져 오는 방법

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output method="xml" indent="yes" /> 
<xsl:strip-space elements="*" /> 

<xsl:param name="sequenceNbrMap" /> 

</xsl> 

나는 동적 키를 기반으로이 맵에서 값을 얻을 필요가 내가 직접 XSLT에이지도를 만들 수 있도록이지도는 동적입니다.

+0

"Java 맵을 변수에 전달"하는 자바 코드를 보여줄 수 있습니까? XSLT 측의 색슨 (Saxon)이'XdmValue'처럼 처리 할 수 ​​있습니까? –

답변

1

사용자 정의를 사용해 URIResolver를 사용하여 시도하고 XML 조각으로지도 값을 제공에서 찾을 수 있습니다.

class MapEntryResolver implements URIResolver 
{ 

    private Map<String,String> map = new HashMap<>(); 

    private static final String PREFIX = "map://"; 

    @Override 
    public Source resolve(String href, String base) 
      throws TransformerException 
    { 
     Source snippet = null; 

     String key = href.replace(PREFIX, ""); 

     if(map.containsKey(key)) 
     { 
      snippet = new StreamSource(new StringReader("<" + key + ">" + map.get(key) + "</" + key + ">")); 
     } 

     return snippet; 
    } 

    public void setMap(Map<String,String> map) 
    { 
     this.map = map; 
    } 

} 

xslt의 문서 기능을 사용하여지도 값에 액세스 할 수 있습니다.

<xsl:variable name="mapValue" select="document('map://foo')" /> 

샘플 :

//First create the resolver 
MapEntryResolver uriResolver = new MapEntryResolver(); 
//pass your map 
uriResolver.setMap(yourMap); 
//and attach it to the factory 
TransformerFactory factory = new TransformerFactoryImpl(); 
factory.setURIResolver(uriResolver); 
Transformer transformer = factory.newTransformer(new StreamSource(this.getClass().getResourceAsStream(pathToYourXsl)); 
//start transform and store result 
ByteArrayOutputstream result = new ByteArrayOutputstream(); 
transformer.transform(new StreamSource(pathToYourInputXml), new StreamResult(result)); 

를 사용해 URIResolver이 같은 요구에지도 데이터의 XML 조각을 작성하여 XSL에서

<key>value</key> 

제공하여 조각을 얻을 수있는 문서 기능을 사용하여 지도 키를 매개 변수로 사용 :

<!-- variable contains snippet <foo>bar</foo> --> 
<xsl:variable name="mapValue" select="document('map://foo')" /> 
<!-- use it like any other doc--> 
<xsl:value-of select="$mapValue/foo"/> 
+0

기분이 좋지만 매우 똑똑합니다! – GPI

+0

XSLT 프로세스가 처음입니다. 당신은 조금 설명해 주실 수 있습니다. 내가 소스 xml을 가지고 있기 때문에 어떻게이 xml 맵을 소스 xml에 추가 할 수 있으며 java 코드는 맵에서 xml 소스를 생성하지 못합니다. –

+0

몇 가지 샘플 코드를 제공했습니다. –

관련 문제