我试图将Freemarker用作XSLT和模板的组合。为了做到这一点,我需要能够提取DOM的一部分文本,但不包括输出中的命名空间。
我的输入XML是:
<soap:update xmlns:soap="http://soap.borrower.random.com">
<soap:cin>data</soap:cin>
<soap:borrower>
<soap:ID>data</soap:ID>
<soap:SSN>data</soap:SSN>
<soap:city>data</soap:city>
<soap:first>data</soap:first>
<soap:last>data</soap:last>
<soap:line1>data</soap:line1>
<soap:phone>data</soap:phone>
<soap:state>data</soap:state>
<soap:zip>data</soap:zip>
</soap:borrower>
</soap:update>
我的模板是:
<#ftl ns_prefixes={"D":"http://soap.borrower.random.com"}>
<#assign xmlmsg = message.contentAsXml>
<update xmlns="http://mynewnamespace.org">
<cin>555</cin>
<borrower>
${xmlmsg.update.borrower.*.@@markup}
</borrower>
</update
我得到的输出是:
<update xmlns="http://mynewnamespace.org">
<cin>555</cin>
<borrower>
<ID xmlns="http://soap.borrower.random.com">data</ID>
<SSN xmlns="http://soap.borrower.random.com">data</SSN>
<city xmlns="http://soap.borrower.random.com">data</city>
<first xmlns="http://soap.borrower.random.com">data</first>
<last xmlns="http://soap.borrower.random.com">data</last>
<line1 xmlns="http://soap.borrower.random.com">data</line1>
<phone xmlns="http://soap.borrower.random.com">data</phone>
<state xmlns="http://soap.borrower.random.com">data</state>
<zip xmlns="http://soap.borrower.random.com">data</zip>
</borrower>
</update>
当然,这在技术上是正确的,但我真的需要从单个元素中删除所有名称空间声明,以便我可以将该文本粘贴到我创建的元素中并让这些元素成为名称空间他们的父母。
有一种简单的方法吗?
TIA
伊恩
答案 0 :(得分:0)
我在这里找到了一个解决方案,它不是最漂亮的东西,但它确实适用于这个特定场景。
基本上我可以使用正则表达式模式中内置的Freemarker replace
删除任何xmlsns属性,如下所示:${xmlmsg.update.borrower.*.@@markup?replace('\\sxmlns=\"[^\"]*\"','','r'))}
。
它有点严峻,并不适用于所有场景(例如,当使用前缀指定命名空间时,但对于我的场景,它没问题。
答案 1 :(得分:0)
你不能...... FreeMarker只生成文本,并且不知道命名空间是否已在输出中声明。所以它保持安全。
就我个人而言,我不会将FreeMarker用于类似XSLT的作业,而将XML转换为类似的XML。 XSLT就更好了,因为它专门用于输出XML。 FreeMarker XML支持更多的是从XML中提取一些数据,并基于它来打印HTML等。