in xsec/canon/XSECC14n20010315.cpp [734:915]
bool XSECC14n20010315::checkRenderNameSpaceNode(DOMNode *e, DOMNode *a) {
DOMNode *parent;
DOMNode *att;
DOMNamedNodeMap *atts;
// If XPath and node not selected, then never print
if (m_XPathSelection && ! m_XPathMap.hasNode(a))
return false;
// BUGFIX: we need to skip xmlns:xml if the value is http://www.w3.org/XML/1998/namespace
if (strEquals(a->getLocalName(), "xml") && strEquals(a->getNodeValue(), "http://www.w3.org/XML/1998/namespace"))
return false;
// First - are we exclusive?
safeBuffer localName;
bool processAsExclusive = false;
if (m_exclusive) {
if (strEquals(a->getNodeName(), "xmlns")) {
processAsExclusive = m_exclusiveDefault;
}
else {
localName << (*mp_formatter << a->getLocalName());
processAsExclusive = !inNonExclNSList(localName);
}
}
if (processAsExclusive) {
// Is the parent in the node-set?
if (m_XPathSelection && !m_XPathMap.hasNode(e))
return false;
// Is the name space visibly utilised?
localName << (*mp_formatter << a->getLocalName());
if (localName.sbStrcmp("xmlns") == 0)
localName[0] = '\0'; // Is this correct or should Xerces return "" for default?
if (!visiblyUtilises(e, localName))
return false;
// If we are the top node, then this has never been printer
if (e == mp_firstElementNode)
return true;
// Make sure previous nodes do not use the name space (and have it printed)
parent = e->getParentNode();
while (parent != NULL) {
if (!m_XPathSelection || m_XPathMap.hasNode(parent)) {
// An output ancestor
if (visiblyUtilises(parent, localName)) {
// Have a hit!
while (parent != NULL) {
atts = parent->getAttributes();
att = (atts != NULL) ? atts->getNamedItem(a->getNodeName()) : NULL;
if (att != NULL && (!m_XPathSelection || m_XPathMap.hasNode(att))) {
// Check URI is the same
if (strEquals(att->getNodeValue(), a->getNodeValue()))
return false;
return true;
}
// If we are using the namespace stack, we need to go up until
// we found the defining attribute for this node
if (m_useNamespaceStack) {
parent = parent->getParentNode();
}
else
return true;
}
// Even if we are using the namespace stack, we have never
// printed this namespace
return true;
}
}
if (parent == mp_firstElementNode)
parent = NULL;
else
parent = parent->getParentNode();
}
// Didn't find it rendered!
return true;
}
// Either we are now in non-exclusive mode, or the name space in question
// Is to be treated as non-exclusive
// Never directly render a default
if (strEquals(a->getNodeName(), "xmlns") && strEquals(a->getNodeValue(), ""))
return false;
// If using a namespace stack, then we need to check whether the current node is in the nodeset
// Only really necessary for envelope txfms in boundary conditions
if (m_useNamespaceStack && m_XPathSelection && !m_XPathMap.hasNode(e))
return false;
// Otherwise, of node is at base of selected document, then print
if (e == mp_firstElementNode)
return true;
if (m_useNamespaceStack) {
// In this case, we need to go up until we find the namespace definition
// in question
parent = e->getParentNode();
while (parent != NULL) {
if (!m_XPathSelection || m_XPathMap.hasNode(parent)) {
DOMNamedNodeMap *pmap = parent->getAttributes();
DOMNode *pns;
if (pmap)
pns = pmap->getNamedItem(a->getNodeName());
else
pns = NULL;
if (pns != NULL) {
// Note we don't check XPath inclusion, as we shouldn't be
// using the namespace stack for XPath expressions
if (strEquals(pns->getNodeValue(), a->getNodeValue()))
return false;
else
return true; // Was defined but differently
}
}
parent = parent->getParentNode();
}
// Obviously we haven't found it!
return true;
}
// Find the parent and check if the node is already defined or if the node
// was out of scope
parent = e->getParentNode();
// if (m_XPathSelection && !m_XPathMap.hasNode(parent))
// return true;
while (m_XPathSelection && parent != NULL && !m_XPathMap.hasNode(parent))
parent = parent->getParentNode();
if (parent == NULL)
return true;
DOMNamedNodeMap *pmap = parent->getAttributes();
DOMNode *pns = pmap->getNamedItem(a->getNodeName());
if (pns != NULL) {
if (m_XPathSelection && !m_XPathMap.hasNode(pns))
return true; // Not printed in previous node
if (strEquals(pns->getNodeValue(), a->getNodeValue()))
return false;
else
return true; // Was defined but differently
}
return true; // Not defined in previous node
}