繁体   English   中英

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

[英]xquery transformation creates empty namespace in element

对不起,但我想我看不到我在这里犯的错误。 我有一个骆驼路线,该路线返回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-element:

<?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元素不在默认名称空间中吗?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM