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 转换在元素中创建空命名空间的主要内容,如果未能解决你的问题,请参考以下文章