1 回答
TA贡献1847条经验 获得超11个赞
我将回答 Saxon 9.9,因为这是您真正应该使用的版本。Saxon 9.7 中不存在该类XdmMap,因此使用该版本在 Java 和 XSLT 之间传递映射将变得困难或不可能。
您首先需要确定要返回的 XDM 类型:我假设这可能是map(xs:string, xs:string)*- 这是一系列以字符串为键、以字符串为值的映射。
您首先需要在您的getResultType()方法中将其声明为结果类型。这样做可能就足够了:
public SequenceType getResultType() {
return SequenceType.makeSequenceType(ItemType.ANY_MAP, OccurrenceIndicator.ZERO_OR_MORE);
}
这并不像它可能的那样精确,但提供更精确的结果类型除了导致 Saxon 对函数实际返回的内容进行更仔细(和昂贵)的检查之外不会实现任何其他目的。如果您想提供更精确的返回类型,则必须使用ItemTypeFactory.newMapType(...).
然后你的call()方法需要返回这个类型的一个实例。
您需要将每个 Employee 表示为XdmMap. 有两种方法可以构造XdmMap.
(a) 您可以构建一个 Java HashMap<String, String>,然后使用静态方法转换它XdmMap.makeMap()
(b) 您可以逐步构建地图:
XdmMap map = new XdmMap();
map = map.put(new XdmAtomicValue("name"), new XdmAtomicValue("John Doe"));
map = map.put(new XdmAtomicValue("age"), new XdmAtomicValue("24"));
等。请注意,它XdmMap是不可变的,因此每个put()操作都会创建一个新XdmMap实例;原来是不变的。
最后,您需要构建这些实例的序列XdmMap。最简单的方法是构造一个List<XdmMap>包含所有地图的 Java,然后将其转换为一个XdmValueusing new XdmValue(Iterable<...> items).
添加回答
举报