XSLT:在中为每个对象访问Java对象属性/方法

XSLT:在中为每个对象访问Java对象属性/方法,java,arrays,xslt,Java,Arrays,Xslt,所以我有一些Java对象的数组: SomeElementsArray[] 我试图访问XSLT样式表文件中每个对象的属性,如下所示: <xsl:for-each select="//data/SomeElementsArray"> <xsl:variable name="dto" select="current()" /> <block> <xsl:value-of select="someObjectAttribute" />

所以我有一些Java对象的数组:

SomeElementsArray[]
我试图访问XSLT样式表文件中每个对象的属性,如下所示:

<xsl:for-each select="//data/SomeElementsArray">
 <xsl:variable name="dto" select="current()" />
  <block>
    <xsl:value-of select="someObjectAttribute" />
  </block>
</xsl:for-each>
[Lcom.domain.core.model.SomeElements;@3f38dd0
public static void write(String stylesheetText, Map<String, ?> input, OutputStream output) {
    StringBuilder xml = new StringBuilder();
    xml.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n");
    xml.append("<data>");
    for(Map.Entry<String, ?> entry: input.entrySet()) {
        field(xml, entry.getKey(), entry.getValue());
    }
    xml.append("</data>");
    FopFactory fopFactory = FopFactory.newInstance();
    FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
    try {
        TransformerFactory factory = TransformerFactory.newInstance();
        StreamSource source = new StreamSource(new StringReader(stylesheetText));
        Transformer transformer = factory.newTransformer(source);
        transformer.setParameter("versionParam", "2.0");
        Source s = new StreamSource(new StringReader(xml.toString()));
        Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, output);
        Result result = new SAXResult(fop.getDefaultHandler());
        transformer.transform(s, result);
        output.close();
    } catch (IOException exception) {
        throw new PdfException(exception);
    } catch (TransformerException exception) {
        throw new PdfException(exception);
    } catch (TransformerFactoryConfigurationError exception) {
        throw new PdfException(exception);
    } catch (FOPException exception) {
        throw new PdfException(exception);
    }
}
我使用了许多变量将此XSLT作为一个名为“data”的映射映射data=newHashMap。例如,我可以访问“data/something”,它显示了它应该显示的内容,这个数组映射到“data/SomeElementsArray”中

我做错了什么?数组中对象的所有字段都是公共的,我还有getter和setter…请帮助

以下是解决方案:

首先,贴图中的值不能是任何类型的对象。XSLT至少我正在使用的-1.0版本只支持基本值,即字符串、int、布尔值、节点等。它不能是我正在传递的数组类型,即SomeElementsArray[]。在某种程度上,必须将值带到原语中。 为了传递该数组,必须进行自定义转换,这意味着对于HashMaps、ArrayList等类型,我需要编写一些生成XML/XSLT节点的代码。例如,下面是一些递归执行转换的代码:

private static void field(StringBuilder builder, String tag, Object content) {
    if(content == null) {
        return;
    } else if(content instanceof Iterable) {
        for(Object object: (Iterable) content) {
            field(builder, tag, object);
    }
    return;
} else if(content.getClass().isArray() && !(content instanceof  Map)) {
    for(int i = 0; i < Array.getLength(content); i++) {
        field(builder, tag, Array.get(content, i));
    }
    return;
}
if(content instanceof Double || content instanceof Float) content = String.format("%.2f", content);
if(content instanceof Date) content = dateFormat.format(content);
if(content instanceof Calendar) content = dateFormat.format(new Date(((Calendar) content).  getTimeInMillis()));
builder.append("<");
builder.append(tag);
builder.append(">");
if(content instanceof Map) {
    Map map = (Map) content;
    for(Object object: map.entrySet()) {
        Map.Entry entry = (Map.Entry) object;
        field(builder, (String) entry.getKey(), entry.getValue());
    }
} else {
    try { //making sure that characters are decoded in case they
        //are encoded
        content = URLDecoder.decode(content.toString(), "UTF-8");
    } catch (UnsupportedEncodingException e) {
        //silently ignores error
        //and content will be untouched
    }
    String value = content.toString().
            replace("&", "&amp;").
            replace("<", "&lt;").
            replace(">", "&gt;").
            replace("'", "&apos;").
            replace("\"", "&quot;");
    builder.append(value);
}
builder.append("</");
builder.append(tag);
builder.append(">");}

基本上,上面的转换允许在映射中使用任何类型的值,因此现在可以使用映射,您需要告诉我们您使用的是哪个XSLT处理器。访问Java对象的约定各不相同。我没有问哪个XSLT版本,而是问哪个处理器:例如Xalan、Saxon、IBM Websphere、Oracle XDK、MarkLogic、Altova。当涉及到供应商扩展时,它们都是不同的。