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

Posted

技术标签:

【中文标题】xquery 转换在元素中创建空命名空间【英文标题】:xquery transformation creates empty namespace in element 【发布时间】:2017-10-03 09:41:51 【问题描述】:

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

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>

单元测试中的 sn-p:我正在使用 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 元素不在默认命名空间中吗?

【问题讨论】:

当我尝试将您的 XQuery 简化为最小的、自包含的、可执行的示例并使用 Saxon 或 Altova 执行它时,结果没有命名空间的 xmlns="" 未声明。那么您使用哪个 XQuery 实现?我也不确定您的 Java 代码是如何相关的,但总的来说,我会尝试确保您使用命名空间感知文档构建器而不是默认的、不感知命名空间的文档构建器,因此在创建 DocumentBuilder 之前在工厂上设置 setNamespaceAware(true) 嗨,你好棒! #setNamespaceAware(true) 丢失。这就是为什么我也添加了 javacode,因为在 Oxygen XML Developer 中没有出现问题,但只有在我使用 JAVA 代码时才会出现问题。但是因为我不确定是否存在差异,所以我没有提到它:-)。如果您希望我给予您应得的支持并将您的评论标记为解决方案,请创建一个答案。非常感谢! 【参考方案1】:

您发布的 XQuery 应该可以在没有显示名称空间未声明的情况下正常创建结果。

在您的 Java 代码中,如果您想使用带有命名空间的 XML,请确保使用可识别名称空间的 DocumentBuilder,因为默认的 DocumentBuilderFactory 不支持名称空间,请确保在使用它创建 DocumentBuilder 之前在工厂上设置 setNamespaceAware(true)

【讨论】:

以上是关于xquery 转换在元素中创建空命名空间的主要内容,如果未能解决你的问题,请参考以下文章

Xpath或Xquery忽略任何类型的命名空间前缀

如何使用 XSLT 替换命名空间中的元素?

XSLT 将命名空间前缀添加到元素最佳实践

XQuery 术语

在 .NET 中创建 C++ ATL COM 嵌套命名空间,如 System 命名空间

将命名空间添加到根元素