XQuery多个名称空间声明

时间:2018-04-12 09:45:34

标签: xml xquery transformation xmlbeans

在我的研究过程中,我认为问题是fn-bea:serialize()功能。

我使用org.apache.xmlbeans的XQuery引擎为每个 child node写入命名空间,而OSB Transformation只为root node写入。< / p>

以下是来自OSB的转换结果片段,其中调用了serialize()函数:

    <urn:XML>
&lt;tns:telegramm TITLE="Universelle Messtelegramme" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="tns">
                    &lt;tns:header ANGELEGT_AM="20160705" ANGELEGT_UM="221626" ANGELEGT_VON="ub2" ANZAHL_RS="12" AUFARB="" DATEINAME="CW4122Y20160705221626" FHM="K000003508191" GANGRICHTUNG="V" GERAET="CW4" IDENT_ART="F" MATERIALNUMMER="" MESSDATUM="20160705" MESSZEIT="221626" PARKNR="" SERIALNUMMER="" TAG_FAHRZEUG="" TAG_RADSATZ="" TPLNR="94800442311-7" URMASS="" WERK="122Y"/>
                    &lt;tns:position EINBAUORT="01" LFDNR="1">
                            &lt;tns:komponente TYP="Radscheibe links">
                                    &lt;tns:merkmal MESSWERT="28,6" SORTFELD="SH"/>
                                    &lt;tns:merkmal MESSWERT="29,9" SORTFELD="SD"/>
                                    &lt;tns:merkmal MESSWERT="10,5" SORTFELD="QR"/>
                                    &lt;tns:merkmal MESSWERT="136,8" SORTFELD="BR"/>
                                    &lt;tns:merkmal MESSWERT="0,0" SORTFELD="HHY"/>
                            &lt;/tns:komponente>
                            &lt;tns:komponente TYP="Radscheibe rechts">
                                    &lt;tns:merkmal MESSWERT="28,8" SORTFELD="SH"/>
                                    &lt;tns:merkmal MESSWERT="30,0" SORTFELD="SD"/>
                                    &lt;tns:merkmal MESSWERT="11,0" SORTFELD="QR"/>
                                    &lt;tns:merkmal MESSWERT="136,5" SORTFELD="BR"/>
                                    &lt;tns:merkmal MESSWERT="0,0" SORTFELD="HHY"/>
                            &lt;/tns:komponente>
                            &lt;tns:komponente TYP="Radsatz">
                                    &lt;tns:merkmal MESSWERT="1361,2" SORTFELD="AR"/>
                            &lt;/tns:komponente>
                            &lt;tns:komponente TYP="Radsatz">
                                    &lt;tns:merkmal MESSWERT="1421,2" SORTFELD="SR"/>
                            &lt;/tns:komponente>
                    &lt;/tns:position>
            &lt;/tns:telegramm>
</urn:XML>

然而XmlBeans转换会为每个子节点写soapenvtns,如下所示:

  <urn:XML>&lt;tns:telegramm TITLE="Universelle Messtelegramme" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="tns">
            &lt;tns:header ANGELEGT_AM="20160705" ANGELEGT_UM="221626" ANGELEGT_VON="ub2" ANZAHL_RS="12" AUFARB="" DATEINAME="CW4122Y20160705221626" FHM="K000003508191" GANGRICHTUNG="V" GERAET="CW4" IDENT_ART="F" MATERIALNUMMER="" MESSDATUM="20160705" MESSZEIT="221626" PARKNR="" SERIALNUMMER="" TAG_FAHRZEUG="" TAG_RADSATZ="" TPLNR="94800442311-7" URMASS="" WERK="122Y" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="tns"/>
            &lt;tns:position EINBAUORT="01" LFDNR="1" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="tns">
...

搜索网页并阅读apache documentation我无法找到有关此方案的任何信息,以便在已在根网站上声明时从子节点删除命名空间。

1 个答案:

答案 0 :(得分:0)

您是否尝试过设置XmlOptions setAggressiveNamespaces()

  

使保护程序减少名称空间前缀声明的数量。保护程序将通过两次传递文档来完成此操作,首先是收集所需的命名空间声明集,然后是第二次使用在根目录中收集的声明来保存文档。

和/或setSaveSuggestedPrefixes()带有命名空间的散列图?

  

如果已经在保存的片段范围之外声明了名称空间,则允许将这些映射传递给保护程序,因此不会重新声明前缀。

HashMap NamespaceMap = new HashMap();
NamespaceMap.put("http://schemas.xmlsoap.org/soap/envelope/", "soapenv");
NamespaceMap.put("tns", "tns");

XmlOptions xmlOptions = new XmlOptions();
xmlOptions.setSavePrettyPrint();
xmlOptions.setSaveSuggestedPrefixes(NamespaceMap);
xmlOptions.setSaveAggressiveNamespaces();
xmlOptions.setUseDefaultNamespace();

try {
    docObject.save(xmlFile, xmlOptions);
} catch (IOException e) {
    e.printStackTrace();
}