我试图通过样式表的参数将多个节点集传递到WSO2 ESB中的XSLT介体中的XSLT。但是,当试图引用XSLT处理器中传递的参数时,表示值是字符串类型。
XSLT介体配置本身的结构如下:
<xslt key="conf:/Test/TestMapping.xsl">
<property xmlns:ns="http://org.apache.synapse/xsd" xmlns:ns3="http://org.apache.synapse/xsd" name="originalMsg" expression="get-property('OriginalMsg')" />
</xslt>
在XSLT本身中,当传递的参数用于尝试引用此数据中的元素时,例如
<xsl:value-of select="$originalMsg/ns1:Node/ns1:OtherNode"/>
错误报告“/”操作在期望节点集时不能应用于字符串。
我试图传递一个节点集,它是流程中上一步的消息体,我尝试了各种方法来保存:
通过Enrich调解员:
<enrich>
<source clone="true" type="body" xpath="" property="" />
<target action="replace" type="property" xpath="" property="OriginalMsg" />
</enrich>
通过物业调解员:
<property xmlns:ns="http://org.apache.synapse/xsd" xmlns:ns3="http://org.apache.synapse/xsd" name="OriginalMsg" expression="$body" scope="default" type="OM" />
但这没效果。
或者,有没有办法在ESB函数中使用document()来引用消息上下文数据或其他一些方法?
答案 0 :(得分:1)
我通过使用Enrich中介添加了我需要作为兄弟节点包含在邮件正文中当前根元素的其他XML数据层次结构来解决这个问题。
这允许在XSLT中提供所有不同的数据。
然后在XSLT中介配置中,我将源路径设置为$ body(即消息体)而不是默认值(它是消息体的第一个子节点),并在XSLT本身中添加了一个SOAP Body元素作为根元素。通过这种方式,消息体的所有子节点都被单个目标XML结构替换。
答案 1 :(得分:0)
这是因为在XSLT中介代码中:
private void applyProperties(Transformer transformer, MessageContext synCtx, SynapseLog synLog) {
for (MediatorProperty prop : properties) {
if (prop != null) {
String value;
if (prop.getValue() != null) {
value = prop.getValue();
} else {
value = prop.getExpression().stringValueOf(synCtx);
}
if (synLog.isTraceOrDebugEnabled()) {
if (value == null) {
synLog.traceOrDebug("Not setting parameter '" + prop.getName() + "'");
} else {
synLog.traceOrDebug("Setting parameter '" + prop.getName() + "' to '"
+ value + "'");
}
}
if (value != null) {
transformer.setParameter(prop.getName(), value);
}
}
}
您可以看到值始终是String。我建议在注入变压器之前为属性添加属性类型。
您怎么看?