Saxon XSLT自定义Java函数返回多个值

时间:2013-11-26 18:14:00

标签: java xslt xslt-2.0 saxon

我使用Saxon-He v.9.5.1-2进行XSLT,我需要一个自定义Java函数,让我在一次调用中返回多个值(最好是值映射)。这有可能实现吗?

我一直在考虑像这样扩展net.sf.saxon.lib.ExtensionFunctionDefinition类:

public class GetSth extends ExtensionFunctionDefinition {

    @Override
    public StructuredQName getFunctionQName() {
        return new StructuredQName("bf", "http://some.url.com/", "get-sth");
    }

    @Override
    public SequenceType[] getArgumentTypes() {
        return new SequenceType[]{SequenceType.ATOMIC_SEQUENCE};
    }

    @Override
    public SequenceType getResultType(SequenceType[] suppliedArgumentTypes) {
        return SequenceType.NODE_SEQUENCE;
    }

    @Override
    public ExtensionFunctionCall makeCallExpression() {
        return new ExtensionFunctionCall() {
            @Override
            public Sequence call(XPathContext context, Sequence[] arguments) throws XPathException {
                Map<String, String> map = <my_map_here>;
                /*
                    How to return multiple values? I would expect to return some class from net.sf.saxon.value package.
                    return ?
                */                  
            }
        };
    }
}

如果地图不可能,那么如何返回列表呢?请指教。

1 个答案:

答案 0 :(得分:0)

Saxon-HE不支持地图,因此您必须找到其他代表。您当然可以构造某种XML文档,或者您可以返回一个字符串列表,其中键/值对在微结构中表示为单个字符串,例如“key:value”,然后您可以在其中解析XSLT代码。例如:

List<StringValue> list = new ArrayList<StringValue>();
for (MapEntry m : map.entrySet()) {
  list.add(new StringValue(m.getKey() + ":" + m.getValue());
}
return new SequenceExtent(list);