2017-12-26 12 views
-1

Ich habe eine Java-Methode, die eine Zuordnung zu xslt zurückgibt.xslt 2.0: mit HashMap

XSLT Methodenaufruf -

<xsl:variable name="mapValue" select="class:returnMap()"> 

Java-Methode -

public Map<String,List<String>> returnMap(){ 
    Map<String,List<String>> map = new HashMap<String,List<String>>(); 
    List<String> list = new ArrayList<String>(); 
    list.add("1"); 
    list.add("2"); 
    map.put("a",list); 
    map.put("b",list); 
    return map 
} 

Wie hole ich die Liste Wert der Karte in XSLT 2.0? Ich habe versucht, die Werte einer Variablen zugewiesen, die unter Verwendung des Formats

<xsl:variable name="valueOfA" select="$mapValue/entry[@key='a']"/> 
<xsl:variable name="valueOfB" select="$mapValue/entry[@key='b']"/> 

aber, ich erhielt die unten Ausnahme.

XPTY0019: Required item type of first operand of '/' is node(); supplied value has item type java:java.util.LinkedHashMap 

Wenn ich versuche, den Wert von $ mapValue anzuzeigen, druckt es einwandfrei.

+0

Welchen XSLT 2.0-Prozessor verwenden Sie, welche Version, welche Edition? Haben Sie seine Dokumentation wie z. https://www.saxona.com/html/documentation9.7/extensibility/ oder http://manual.altova.com/RaptorXML/raptorxmlserver/index.html?fxmisc_java.htm –

+0

Beachten Sie auch, wenn Sie Saxon dann mit 9.8 verwenden (alle Editionen) können Sie XSLT 3 mit XPath 3.1 Karten verwenden, wo Sie einfach Ihre Java 'Map' in eine XPath 3.1' map' konvertieren können, indem Sie https://www.saxonica.com/html/documentation/javadoc/net/sf verwenden /saxon/s9api/XdmMap.html#makeMap-java.util.Map- auf der Java-Seite des Codes und zurück zu XSLT/XPath, wo Sie dann die Funktionen wie 'map: keys' von https: // www .w3.org/TR/xpath-functions/# func-map-schlüssel. Für Saxon HE müssten Sie Ihre Funktion als integrierte Erweiterungsfunktion implementieren und registrieren. –

Antwort

0

Die Fehlermeldung zeigt, dass Sie Saxon verwenden. Die Regeln für die Konvertierung zwischen Java-Objekten und XPath-Werten hängen davon ab, welchen Prozessor Sie verwenden, daher ist dies relevant.

Wenn Sie Saxon verwenden, haben Sie Zugriff auf XSLT 3.0 und auf die neuen Map/Array-Datentypen. Dies bedeutet, dass Sie erreichen können, was Sie erreichen möchten, ohne Java aufzurufen.

Der spezifische Fehler, den Sie bekommen, ist, weil (wie die Nachricht sagt) $ mapValue ist kein Knoten, so dass Sie nicht auf seine Kinder mit dem Operator "/" zugreifen können. Wenn Sie stattdessen eine XSLT 3.0-Map verwenden, können Sie auf einen Eintrag zugreifen, z. B. $mapValue?a.

Verwandte Themen