Package net.sf.saxon.event

## Class NamespaceReducer

- java.lang.Object
- - net.sf.saxon.event.SequenceReceiver
  - - net.sf.saxon.event.ProxyReceiver
    - - net.sf.saxon.event.NamespaceReducer

- All Implemented Interfaces:
    `javax.xml.transform.Result`, `Receiver`, `NamespaceResolver`

      public class NamespaceReducer
      extends ProxyReceiver
      implements NamespaceResolver

  `NamespaceReducer` is a `ProxyReceiver` responsible for removing duplicate namespace declarations. It also ensures that an `xmlns=""` undeclaration is output when necessary. Used on its own, the `NamespaceReducer` simply eliminates unwanted namespace declarations. It can also be subclassed, in which case the subclass can use the services of the `NamespaceReducer` to resolve QNames.

  The `NamespaceReducer` also validates namespace-sensitive content.

- - ### Field Summary

    - ### Fields inherited from class net.sf.saxon.event.ProxyReceiver

      `nextReceiver`

    - ### Fields inherited from class net.sf.saxon.event.SequenceReceiver

      `pipelineConfiguration, previousAtomic, systemId`

    - ### Fields inherited from interface javax.xml.transform.Result

      `PI_DISABLE_OUTPUT_ESCAPING, PI_ENABLE_OUTPUT_ESCAPING`

  - ### Constructor Summary

    Constructors
    Constructor | Description
    --- | ---
    `NamespaceReducer​(Receiver next)` | Create a NamespaceReducer

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `void` | `endElement()` | endElement: Discard the namespaces declared on this element.
    `java.lang.String` | `getURIForPrefix​(java.lang.String prefix, boolean useDefault)` | Get the namespace URI corresponding to a given prefix.
    `boolean` | `isDisinheritingNamespaces()` | Ask whether the namespace reducer is disinheriting namespaces at the current level
    `java.util.Iterator<java.lang.String>` | `iteratePrefixes()` | Get an iterator over all the prefixes declared in this namespace context.
    `void` | `startElement​(NodeName elemName, SchemaType type, AttributeMap attributes, NamespaceMap namespaceMap, Location location, int properties)` | startElement.

    - ### Methods inherited from class net.sf.saxon.event.ProxyReceiver

      `append, characters, close, comment, endDocument, getNamePool, getNextReceiver, open, processingInstruction, setPipelineConfiguration, setSystemId, setUnderlyingReceiver, setUnparsedEntity, startDocument, usesTypeAnnotations`

    - ### Methods inherited from class net.sf.saxon.event.SequenceReceiver

      `append, decompose, flatten, getConfiguration, getErrorCodeForDecomposingFunctionItems, getPipelineConfiguration, getSystemId, handlesAppend`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Constructor Detail

    - #### NamespaceReducer

          public NamespaceReducer​(Receiver next)

      Create a NamespaceReducer
      Parameters:
        `next` - the Receiver to which events will be passed after namespace reduction

  - ### Method Detail

    - #### startElement

          public void startElement​(NodeName elemName,
                                   SchemaType type,
                                   AttributeMap attributes,
                                   NamespaceMap namespaceMap,
                                   Location location,
                                   int properties)
                            throws XPathException

      startElement. This call removes redundant namespace declarations, and possibly adds an xmlns="" undeclaration.
      Specified by:
        `startElement` in interface `Receiver`
      Overrides:
        `startElement` in class `ProxyReceiver`
      Parameters:
        `elemName` - the name of the element.
        `type` - the type annotation of the element.
        `attributes` - the attributes of this element
        `namespaceMap` - the in-scope namespaces of this element: generally this is all the in-scope namespaces, without relying on inheriting namespaces from parent elements
        `location` - an object providing information about the module, line, and column where the node originated
        `properties` - bit-significant properties of the element node. If there are no relevant properties, zero is supplied. The definitions of the bits are in class `ReceiverOption`
      Throws:
        `XPathException` - if an error occurs

    - #### isDisinheritingNamespaces

          public boolean isDisinheritingNamespaces()

      Ask whether the namespace reducer is disinheriting namespaces at the current level
      Returns:
        true if namespaces are being disinherited

    - #### endElement

          public void endElement()
                          throws XPathException

      endElement: Discard the namespaces declared on this element.
      Specified by:
        `endElement` in interface `Receiver`
      Overrides:
        `endElement` in class `ProxyReceiver`
      Throws:
        `XPathException` - if an error occurs

    - #### getURIForPrefix

          public java.lang.String getURIForPrefix​(java.lang.String prefix,
                                                  boolean useDefault)

      Get the namespace URI corresponding to a given prefix. Return null if the prefix is not in scope.
      Specified by:
        `getURIForPrefix` in interface `NamespaceResolver`
      Parameters:
        `prefix` - the namespace prefix
        `useDefault` - true if the default namespace is to be used when the prefix is ""
      Returns:
        the uri for the namespace, or null if the prefix is not in scope

    - #### iteratePrefixes

          public java.util.Iterator<java.lang.String> iteratePrefixes()

      Get an iterator over all the prefixes declared in this namespace context. This will include the default namespace (prefix="") and the XML namespace where appropriate
      Specified by:
        `iteratePrefixes` in interface `NamespaceResolver`
      Returns:
        an iterator over all the prefixes for which a namespace binding exists, including the zero-length string to represent the null/absent prefix if it is bound