当我调用网络服务函数时,我得到以下响应 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。