net.sf.saxon.event

Class StartTagBuffer

Implemented Interfaces:
NamespaceResolver, Receiver, Result
Known Direct Subclasses:
IDFilter

public class StartTagBuffer
extends ProxyReceiver
implements NamespaceResolver

StartTagBuffer is a ProxyReceiver that buffers attributes and namespace events within a start tag. It maintains details of the namespace context, and a full set of attribute information, on behalf of other filters that need access to namespace information or need to process attributes in arbitrary order.

StartTagBuffer also implements namespace fixup (the process of creating namespace nodes|bindings on behalf of constructed element and attribute nodes). Although this would be done anyway, further down the pipeline, it has to be done early in the case of a validating pipeline, because the namespace bindings must be created before any namespace-sensitive attribute content is validated.

Field Summary

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

nextReceiver

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

pipelineConfiguration, previousAtomic, systemId

Method Summary

void
attribute(int nameCode, int typeCode, CharSequence value, int locationId, int properties)
Notify an attribute.
protected void
declareAllNamespaces()
protected void
declareNamespacesForStartElement()
void
endDocument()
Notify the end of a document node
void
endElement()
endElement: Discard the namespaces declared on this element.
String
getAttribute(int nameCode)
Get the value of the current attribute with a given nameCode
int
getElementNameCode()
Get the name of the current element
protected short
getURICode(short prefixCode)
Get the URI code corresponding to a given prefix code, by searching the in-scope namespaces.
String
getURIForPrefix(String prefix, boolean useDefault)
Get the namespace URI corresponding to a given prefix.
boolean
hasAttributes()
Determine if the current element has any attributes
Iterator
iteratePrefixes()
Get an iterator over all the prefixes declared in this namespace context.
void
namespace(int namespaceCode, int properties)
Notify a namespace.
void
setPipelineConfiguration(PipelineConfiguration config)
Set the pipeline configuration
void
startContent()
startContent: Add any namespace undeclarations needed to stop namespaces being inherited from parent elements
void
startDocument(int properties)
Start of a document node.
void
startElement(int nameCode, int typeCode, int locationId, int properties)
startElement
protected void
undeclareNamespacesForElement()

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

append, attribute, characters, close, comment, endDocument, endElement, getConfiguration, getDocumentLocator, getNamePool, getUnderlyingReceiver, namespace, open, processingInstruction, setPipelineConfiguration, setSystemId, setUnderlyingReceiver, setUnparsedEntity, startContent, startDocument, startElement

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

append, getConfiguration, getNamePool, getPipelineConfiguration, getSystemId, open, setPipelineConfiguration, setSystemId, setUnparsedEntity

Method Details

attribute

public void attribute(int nameCode,
                      int typeCode,
                      CharSequence value,
                      int locationId,
                      int properties)
            throws XPathException
Notify an attribute. Attributes are notified after the startElement event, and before any children. Namespaces and attributes may be intermingled.
Specified by:
attribute in interface Receiver
Overrides:
attribute in interface ProxyReceiver
Parameters:
nameCode - The name of the attribute, as held in the name pool
typeCode - The type of the attribute, as held in the name pool
properties - Bit significant value. The following bits are defined:

declareAllNamespaces

protected void declareAllNamespaces()
            throws XPathException

declareNamespacesForStartElement

protected void declareNamespacesForStartElement()
            throws XPathException

endDocument

public void endDocument()
            throws XPathException
Notify the end of a document node
Specified by:
endDocument in interface Receiver
Overrides:
endDocument in interface ProxyReceiver

endElement

public void endElement()
            throws XPathException
endElement: Discard the namespaces declared on this element.
Specified by:
endElement in interface Receiver
Overrides:
endElement in interface ProxyReceiver

getAttribute

public String getAttribute(int nameCode)
Get the value of the current attribute with a given nameCode
Parameters:
nameCode - the name of the required attribute
Returns:
the attribute value, or null if the attribute is not present

getElementNameCode

public int getElementNameCode()
Get the name of the current element
Returns:
the namepool namecode of the element

getURICode

protected short getURICode(short prefixCode)
Get the URI code corresponding to a given prefix code, by searching the in-scope namespaces. This is a service provided to subclasses.
Parameters:
prefixCode - the 16-bit prefix code required
Returns:
the 16-bit URI code, or -1 if the prefix is not bound to any namespace

getURIForPrefix

public String getURIForPrefix(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

hasAttributes

public boolean hasAttributes()
Determine if the current element has any attributes
Returns:
true if the element has one or more attributes

iteratePrefixes

public Iterator 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

namespace

public void namespace(int namespaceCode,
                      int properties)
            throws XPathException
Notify a namespace. Namespaces are notified after the startElement event, and before any children for the element. The namespaces that are reported are only required to include those that are different from the parent element; however, duplicates may be reported. A namespace must not conflict with any namespaces already used for element or attribute names.
Specified by:
namespace in interface Receiver
Overrides:
namespace in interface ProxyReceiver
Parameters:
namespaceCode - an integer: the top half is a prefix code, the bottom half a URI code. These may be translated into an actual prefix and URI using the name pool. A prefix code of zero represents the empty prefix (that is, the default namespace). A URI code of zero represents a URI of "", that is, a namespace undeclaration.

setPipelineConfiguration

public void setPipelineConfiguration(PipelineConfiguration config)
Set the pipeline configuration
Specified by:
setPipelineConfiguration in interface Receiver
Overrides:
setPipelineConfiguration in interface ProxyReceiver
Parameters:
config - the pipeline configuration

startContent

public void startContent()
            throws XPathException
startContent: Add any namespace undeclarations needed to stop namespaces being inherited from parent elements
Specified by:
startContent in interface Receiver
Overrides:
startContent in interface ProxyReceiver

startDocument

public void startDocument(int properties)
            throws XPathException
Start of a document node.
Specified by:
startDocument in interface Receiver
Overrides:
startDocument in interface ProxyReceiver

startElement

public void startElement(int nameCode,
                         int typeCode,
                         int locationId,
                         int properties)
            throws XPathException
startElement
Specified by:
startElement in interface Receiver
Overrides:
startElement in interface ProxyReceiver

undeclareNamespacesForElement

protected void undeclareNamespacesForElement()