【问题标题】:How can use Freemarker to extract nodes from an XML document without including the namespace in the output?如何使用 Freemarker 从 XML 文档中提取节点而不在输出中包含命名空间?
【发布时间】:2016-05-12 23:31:34
【问题描述】:

我正在尝试将 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

伊恩

【问题讨论】:

    标签: xml freemarker


    【解决方案1】:

    我在这里找到了一个解决方案,它不是最漂亮的东西,但它确实适用于这种特定场景。

    基本上我可以在正则表达式模式下使用 Freemarker replace 内置来删除任何出现的 xmlsns 属性,如下所示:${xmlmsg.update.borrower.*.@@markup?replace('\\sxmlns=\"[^\"]*\"','','r'))}

    这有点严峻,它不适用于所有场景(例如,当命名空间指定有前缀时,但对于我的场景来说没问题。

    【讨论】:

      【解决方案2】:

      你不能... FreeMarker 只生成文本,并且不知道命名空间是否已经在输出中声明。所以它保持安全。

      就个人而言,我不会将 FreeMarker 用于将 XML 转换为类似 XML 的类似 XSLT 的工作。 XSLT 在这方面做得更好,因为它专门用于输出 XML。 FreeMarker XML 支持更多的是从 XML 中提取一些数据,并基于它打印 HTML 等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-27
        • 1970-01-01
        • 2011-03-30
        • 1970-01-01
        • 2013-05-11
        • 1970-01-01
        • 2015-10-09
        相关资源
        最近更新 更多