で見つけることができます。
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"/>
「Javaマップを変数に渡す」というJavaコードを表示できますか? XSLT側のSaxonは、 'XdmValue'のように扱うことができますか? –