从多名称空间XML中删除名称空间的数据

时间:2018-10-12 11:57:47

标签: java xml xpath xml-namespaces

我有一个XML,如下所示。该XML具有3个命名空间中的元素。我想删除1个命名空间的数据和元素/属性,并保留带有2个namepsaces及其元素的最终XML。

开发环境:  1.春天  2. Java 8

<ns1:animals xmlns:ns1="http://.../animal" xmlns:ns2="http://.../tiger" xmlns:ns3="http://.../fish">
        <ns1:animalDescription>
            <ns1:animalType>fish</ns1:animalType>
            <ns1:animalLength>VALUE</ns1:animalLength>
            <ns1:partsOfBody>
               <ns1:eyes ns3:isCompund="true">
                  <ns1:countOfEyes>100</ns1:countOfEyes>
               </ns1:eyes>
               <ns3:gills>bigGills</ns3:gills>
         </ns1:animalDescription>
            <ns1:animalDescription>
            <ns1:animalType>TIGER</ns1:animalType>
            <ns1:animalLength>3 meter</ns1:animalLength>
            <ns1:partsOfBody>
               <ns1:eyes>
                  <ns1:countOfEyes>2</ns1:countOfEyes>
               </ns1:eyes>
               <ns2:tailLength>1 Meter</ns2:tailLength>
         </ns1:animalDescription>
    <ns1:animals>

我要删除nameSpace xmlns:ns3 =“ http://.../fish”。我想要如下的最终XML。我已经尝试过执行字符串操作,但对于复杂的xsd而言却没有用。我想使用任何XML API来执行此操作。请指导我。该用什么来达到目的。我正在寻找有效的解决方案。

<ns1:animals xmlns:ns1="http://.../animal" xmlns:ns2="http://.../tiger" xmlns:ns3="http://.../fish">
        <ns1:animalDescription>
            <ns1:animalType>fish</ns1:animalType>
            <ns1:animalLength>VALUE</ns1:animalLength>
            <ns1:partsOfBody>
               <ns1:eyes>
                  <ns1:countOfEyes>100</ns1:countOfEyes>
               </ns1:eyes>

         </ns1:animalDescription>
         <ns1:animalDescription>
            <ns1:animalType>TIGER</ns1:animalType>
            <ns1:animalLength>3 meter</ns1:animalLength>
            <ns1:partsOfBody>
               <ns1:eyes>
                  <ns1:countOfEyes>2</ns1:countOfEyes>
               </ns1:eyes>
               <ns2:tailLength>1 Meter</ns2:tailLength>
         </ns1:animalDescription>
    <ns1:animals>

最终XML没有以下数据。 1. ns3:isCompund =“ true” 2. bigGills

1 个答案:

答案 0 :(得分:0)

在XSLT 3.0中:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
  <xsl:mode on-no-match="shallow-copy"/>
  <xsl:template match="ns3:* ! @ns3:*" xmlns:ns3="http://.../fish"/>
</xsl:transform>

如果只有XSLT 1.0或2.0,请用标准的浅表副本身份模板规则替换xsl:mode声明。