【问题标题】:Transform XML with missing namespace转换缺少命名空间的 XML
【发布时间】:2012-11-14 12:30:56
【问题描述】:

当我调用 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>

当soap命名空间不包含在响应xml中时,我该如何做这个转换?

【问题讨论】:

    标签: xml xslt soap xslt-1.0


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      来自Namespaces in XML 1.1

      命名空间限制:前缀声明

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

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

      【讨论】:

        猜你喜欢
        • 2016-07-08
        • 1970-01-01
        • 2018-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多