xquery 转换在元素中创建空命名空间

问题描述 投票:0回答:2

我很抱歉,但我想我只是没有看到我在这里犯的错误。 我有一个返回 XML 的骆驼路由,为了能够测试输出,我编写了一个与 SpringRunner 一起运行的 JUnit 测试。在那里,我从交换中获取 XML 流,并根据 XSD 进行验证。这非常有效,因为 XSD 会抛出异常,因为输出 XML 无效,但我不明白为什么以下 xquery 会生成带有 EMPTY NAMESPACE 的元素? 请参阅 xquery 片段(再次抱歉,我无法提供更多代码):

declare default element namespace "http://www.dppgroup.com/XXXPMS";
let $cmmdoc := $doc/*:cmmdoc
, $partner := $doc/*:cmmdoc/*:information/*:partner_gruppe/*:partner
, $sequence:= fn:substring($cmmdoc/@unifier,3)
 return <ClientMMS xmlns:infra="http://www.dppgroup.com/InfraNS">
{
    for $x in $partner
    where $x[@partnerStatusCode = " "]
    return
    element {"DataGroup" } {
             <Client sequenceNumber="{$sequence}" />
    }
}

我的问题是,使用此代码生成的 XML 包含具有以下命名空间定义的 DataGroup 元素:

<?xml version="1.0" encoding="UTF-8"?>
<ClientMMS xmlns="http://www.dppgroup.com/XXXPMS"
           xmlns:infra="http://www.dppgroup.com/InfraNS">
   <DataGroup xmlns="">
      <Client sequenceNumber="170908065609671475"/> 
   </DataGroup>
 </ClientMMS>

单元测试中的片段:我正在使用 jdk1.8_102

    String xml = TestDataReader.readXML("/input/info/info_in.xml", PROJECT_ENCODING);
    quelle.sendBody(xml);

    boolean valid = false;
    try {
        DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();

        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream((byte[]) archiv.getExchanges().get(1).getIn().getBody());
        Document document = documentBuilder.parse(byteArrayInputStream);

        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        StreamResult result = new StreamResult(new StringWriter());
        DOMSource source = new DOMSource(document);

        transformer.transform(source, result);
        String xmlString = result.getWriter().toString();
        System.out.println(xmlString);

在任何 XQuery 介绍/教程/解释中我都找不到发生这种情况的原因。 你们能解释一下为什么 DataGroup 元素不在默认命名空间中吗?

java xml namespaces xquery
2个回答
1
投票

您发布的 XQuery 应该可以很好地创建结果,而无需显示您显示的命名空间未声明。

在 Java 代码中,如果您想使用带有命名空间的 XML,请确保使用命名空间感知的 DocumentBuilder,因为默认的 DocumentBuilderFactory 不感知命名空间,请确保在使用它创建 DocumentBuilder 之前在工厂上设置

setNamespaceAware(true)


0
投票

@Martin,我们可以删除这些 xmlns=""> 使用 XQuery 的空白名称空间?

© www.soinside.com 2019 - 2024. All rights reserved.