1

我有一个 XML(来自 Web 服务调用 - 下面提供),它是一个无效的 XML 文档,因为它不包含xsi架构命名空间的命名空间前缀的必需声明。

它不声明模式命名空间 -xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"但在 xml 中使用相同的命名空间。

示例节点是 -<messages xsi:nil="true" /><value4 xsi:nil="true" />

因此,我无法在 XML 上使用 XSLT 转换,并且我的应用程序失败并出现错误

与元素类型“messages”关联的属性“xsi:nil”的前缀“xsi”未绑定。”。

我所有的测试 XSLT 也给出了同样的错误。有没有办法应用一个/任何 XSLT 来删除所有引用的元素xsi?删除它们将使其成为适合其他人使用的有效 XML。

从 Web 服务返回的 XML:

<?xml version="1.0" encoding="utf-8"?>
<p849:retrieveAllValues xmlns:p849="http://package.de.bc.a">
    <retrieveAllValues>
        <messages xsi:nil="true" />
        <existingValues>
            <Values>
                <value1> 10.00</value1>
                <value2>123456</value2>
                <value3>1234</value3>
                <value4 xsi:nil="true" />
                <value5 />
            </Values>
        </existingValues>
        <otherValues xsi:nil="true" />
        <recValues xsi:nil="true" />
    </retrieveAllValues>
</p849:retrieveAllValues>
4

2 回答 2

1

XSLT 被指定为对命名空间格式良好的 XML 进行操作。您的输入不是命名空间格式正确的。这意味着 XSLT 处理器在遇到此类输入时的行为超出了规范的范围,因此这也意味着虽然您可以使用这个或那个技术与这个或那个 XSLT 处理器来处理这个格式错误的输入,但是不是使用 XSLT 执行此操作的标准方法。

您最好的选择是继续尝试找出为什么您的 Web 服务结果格式不正确(这真的是 Web 服务的错​​误,还是某些软件在您看到数据之前就对数据进行了修改?)。如果所有其他方法都失败了,作为权宜之计,我会在输入上使用 sed 或等效方法。但是您的里程可能会有所不同。

于 2013-02-14T15:11:10.983 回答
1

当您在系统中收到格式错误或无效的 XML(我通常称之为非 XML,因为它实际上根本不是 XML)时,您应该尝试追踪它的源头,并尽可能地解决问题尽可能的来源。如果不能从源头上消除问题,就需要尽早修复非XML。修复技术取决于故障的系统性以及您需要修复的故障的性质。在这种情况下,您的数据在技术上是 XML 格式良好但名称空间格式错误,因此您可以使用非名称空间感知 XML 解析器来解决问题 - 将数据加载到非名称空间中的 DOM -aware 模式,添加属性“xmlns:xsi="....",然后序列化。

Most XML tools can only handle well-formed XML, so to process non-XML input you will usually need to use non-XML tools. This case however is one where you can use XML tools so long as they aren't namespace-aware.

于 2013-02-14T21:28:53.383 回答