我正在尝试使用Smooks进行XML-XML转换。当输入 XML 具有多个命名空间时遇到问题。
这是我的示例输入文件
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<look:Trans xmlns:look="http://www.example.com">
<Response>0</Response>
<DGX>
<SIGN>1</SIGN>
</DGX>
</look:Trans>
</soapenv:Body>
</soapenv:Envelope>
和我的斯莫克斯配置文件
<smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd"
xmlns:core="http://www.milyn.org/xsd/smooks/smooks-core-1.4.xsd"
xmlns:ftl="http://www.milyn.org/xsd/smooks/freemarker-1.1.xsd">
<params>
<param name="stream.filter.type">SAX</param>
<param name="default.serialization.on">false</param>
</params>
<resource-config selector="Trans">
<resource>org.milyn.delivery.DomModelCreator</resource>
</resource-config>
<ftl:freemarker applyOnElement="Trans">
<ftl:template>
<!-- <#ftl ns_prefixes={"look": "http://www.example.com"}> <#outputformat 'XML'>
<Response>
<Code>${look:Trans.Response} </Code>
<Sign>${look:Trans.DGX.SIGN} </Sign>
</Response> </#outputformat> -->
</ftl:template>
我怎样才能做到这一点?
我不确定 Smooks 选择哪个 XML 节点作为模板上下文根...如果是soapenv:Body
,那么我在您的模板中看不到问题。无论如何,我已经在 http://try.freemarker.org/上尝试过这个,其中doc
是文档节点(所以这与 Smooks 有所不同(,以证明多个命名空间应该像这样工作:
模板:
<#ftl ns_prefixes={"look": "http://www.example.com", "soapenv": "http://schemas.xmlsoap.org/soap/envelope/"}
output_format="XML">
${doc.soapenv:Envelope.soapenv:Body.look:Trans.DGX.SIGN}
数据模型:
doc=
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<look:Trans xmlns:look="http://www.example.com">
<Response>0</Response>
<DGX>
<SIGN>123</SIGN>
</DGX>
</look:Trans>
</soapenv:Body>
</soapenv:Envelope>
结果:
123
顺便说一句,请注意,您可以向<#ftl ...>
添加output_format='XML'
而不是<#outputformat 'XML'>...</#outputformat>
。它更短。