Thursday, May 28, 2020

Xquery to change namespace of xml

Change namespace of XML - 


xquery version "1.0" encoding "utf-8";

 

(:: OracleAnnotationVersion "1.0" ::)

 

declare variable $src as element() external;

declare variable $ns as xs:string external;

 

declare function local:change-element-ns-deep

  ( $nodes as node()* ,

    $newns as xs:string ,

    $prefix as xs:string )  as node()* {

 

  for $node in $nodes

  return if ($node instance of element())

         then (element

               {QName ($newns,

                          concat($prefix,

                                    if ($prefix = '')

                                    then ''

                                    else ':',

                                    local-name($node)))}

               {$node/@*,

                local:change-element-ns-deep($node/node(),

                                           $newns, $prefix)})

         else if ($node instance of document-node())

         then local:change-element-ns-deep($node/node(),

                                           $newns, $prefix)

         else $node

} ;

local:change-element-ns-deep($src, $ns, 'ns')

XSLT template to remove null values from xml


This simple xquery can help to remove null fields and map only fields with values in any xml.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
      <xsl:if test="normalize-space(.)!='' or ./@* != ''">
        <xsl:copy>
           <xsl:copy-of select="@*"/>
           <xsl:apply-templates/>
        </xsl:copy>
      </xsl:if>
   </xsl:template>
</xsl:stylesheet>