转换缺少命名空间的XML

时间:2012-11-14 12:30:56

标签: xml xslt soap xslt-1.0

当我调用webservice函数时,我得到了这个响应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>

当soap名称空间未包含在响应xml中时,如何进行此转换?

2 个答案:

答案 0 :(得分:1)

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

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

但是否这是可能的,如果确实如此,取决于你使用的是什么XSLT处理器,我不能在不知情的情况下给出更详细的答案。

答案 1 :(得分:-1)

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

来自Namespaces in XML 1.1

  

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

     

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

我担心您将不得不联系任何发布此Web服务的人,并让他们将响应格式更改为正确的XML。