0

当我调用 web 服务函数时,我得到这个响应 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 命名空间。

我想通过删除soap-stuff来转换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 命名空间时,如何进行此转换?

4

2 回答 2

1

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

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

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

于 2012-11-14T13:01:09.507 回答
-1

这就是我所说的格式错误的 XML。无论您尝试用什么来转换它,任何合理的 XSLT 解析器都会给出一些“未绑定前缀”错误的变体。因为源文档对其名称空间的使用“感到困惑”,所以任何后续的 XSLT 也会感到困惑。

来自Namespaces in XML 1.1

命名空间约束:前缀声明

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

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

于 2012-11-14T12:49:15.510 回答