2016-09-01 5 views
0

私はXSLTのJavaマップからデータを取得する必要があります。 私はxalanの使用を知っていますが、実装することはできますが、一般的なTransformerに依存しているため、Saxon-HEを使用する必要があります。 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マップを変数に渡す」というJavaコードを表示できますか? XSLT側のSaxonは、 'XdmValue'のように扱うことができますか? –

答えて

1

Javaマップへのアクセスは、Saxon-HEでの利用が制限されている拡張機能を介してのみ可能です。サクソン拡張関数の完全な情報は、カスタムURIResolverを使用して試してみて、XMLスニペットとしてマップ値を提供

http://www.saxonica.com/documentation/index.html#!extensibility

1

で見つけることができます。

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

私はいくつかのサンプルコードを提供しました –

関連する問題