转换缺少命名空间的 XML



当我调用网络服务函数时,我得到以下响应 xml:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope>
  <soap:Body>
    <Response>
      <Result>
        <Status>Success</Status>
        <Text>Some text</Text>
      </Result>
     </Response>
 </soap:Body>
</soap:Envelope>

如您所见,响应 xml 不包括 soap 命名空间。

我想通过删除肥皂的东西来转换 xml,当我进行 xsl 转换时,我通过将 soap 命名空间添加到响应 xml 中来使其工作,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <Response>
      <Result>
        <Status>Success</Status>
        <Text>Some text</Text>
      </Result>
     </Response>
 </soap:Body>
</soap:Envelope>

当响应 xml 中不包含 soap 命名空间时,如何执行此转换?

该输入是格式正确的,但不是命名空间格式正确的 XML。 您可以使用配置为非命名空间感知的解析器将其解析为 DOM 树,然后使用 XSLT 构造,例如

<xsl:template match="*[local-name() = 'soap:Envelope']">

但是这是否可能,如果是这样,您将如何做到这一点取决于您使用的 XSLT 处理器,我不知道的情况下,我无法给出更详细的答案。

这就是

我所说的格式错误的XML。无论您尝试用什么来转换它,任何明智的 XSLT 解析器都会给出"未绑定前缀"错误的某种变体。由于源文档对其命名空间用法感到"困惑",因此任何后续 XSLT 也会感到困惑。

Namespaces in XML 1.1

命名空间约束:声明的前缀

命名空间前缀(除非是 xml 或 xmlns)必须为 在开始标记的命名空间声明属性中声明 使用前缀的元素或祖先元素中的元素 (即在其内容中出现前缀标记的元素)。 此外,这种声明中最里面的属性值 不得为空字符串。

恐怕您将不得不联系发布此 Web 服务的人,并让他们将其响应格式更改为正确的 XML。

相关内容

  • 没有找到相关文章

最新更新