XSLT:在中为每个对象访问Java对象属性/方法
所以我有一些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" />
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("&", "&").
replace("<", "<").
replace(">", ">").
replace("'", "'").
replace("\"", """);
builder.append(value);
}
builder.append("</");
builder.append(tag);
builder.append(">");}
基本上,上面的转换允许在映射中使用任何类型的值,因此现在可以使用映射,您需要告诉我们您使用的是哪个XSLT处理器。访问Java对象的约定各不相同。我没有问哪个XSLT版本,而是问哪个处理器:例如Xalan、Saxon、IBM Websphere、Oracle XDK、MarkLogic、Altova。当涉及到供应商扩展时,它们都是不同的。