def DomConvert(node, xslParent, xslDoc, extUris, extElements, preserveSpace): if node.nodeType == Node.ELEMENT_NODE: mapping = g_mappings.get(node.namespaceURI, None) if mapping: if not mapping.has_key(node.localName): raise XsltException(Error.XSLT_ILLEGAL_ELEMENT, node.localName) xsl_class = mapping[node.localName] xsl_instance = xsl_class(xslDoc, baseUri=xslParent.baseUri) for attr in node.attributes.values(): if not attr.namespaceURI and attr.localName not in xsl_instance.__class__.legalAttrs: raise XsltException(Error.XSLT_ILLEGAL_ATTR, attr.nodeName, xsl_instance.nodeName) xsl_instance.setAttributeNS(attr.namespaceURI, attr.nodeName, attr.value) xslParent.appendChild(xsl_instance) elif node.namespaceURI in extUris: name = (node.namespaceURI, node.localName) if name in extElements.keys(): ext_class = extElements[name] else: #Default XsltElement behavior effects fallback ext_class = XsltElement xsl_instance = ext_class(xslDoc, node.namespaceURI, node.localName, node.prefix, xslParent.baseUri) for attr in node.attributes.values(): if (attr.namespaceURI, attr.localName) == (XSL_NAMESPACE, 'extension-element-prefixes'): ext_prefixes = string.splitfields(attr.value) for prefix in ext_prefixes: if prefix == '#default': prefix = '' extUris.append(node_nss[prefix]) xsl_instance.setAttributeNS(attr.namespaceURI, attr.nodeName, attr.value) xslParent.appendChild(xsl_instance) else: xsl_instance = LiteralElement(xslDoc, node.namespaceURI, node.localName, node.prefix, xslParent.baseUri) node_nss = GetAllNs(node) for attr in node.attributes.values(): if (attr.namespaceURI, attr.localName) == (XSL_NAMESPACE, 'extension-element-prefixes'): ext_prefixes = string.splitfields(attr.value) for prefix in ext_prefixes: if prefix == '#default': prefix = '' extUris.append(node_nss[prefix]) xsl_instance.setAttributeNS(attr.namespaceURI, attr.nodeName, attr.value ) xslParent.appendChild(xsl_instance) ps = (xsl_instance.namespaceURI, xsl_instance.localName) == (XSL_NAMESPACE, 'text') or xsl_instance.getAttributeNS(XML_NAMESPACE,'space') == 'preserve' #ps = (xsl_instance.namespaceURI, xsl_instance.localName) == (XSL_NAMESPACE, 'text') for child in node.childNodes: DomConvert(child, xsl_instance, xslDoc, extUris, extElements, ps) elif node.nodeType == Node.TEXT_NODE: if string.strip(node.data) or preserveSpace: xsl_instance = LiteralText(xslDoc, node.data) xslParent.appendChild(xsl_instance) return
def startElement(self, name, attribs): self._completeTextNode() (name, qname, nsattribs) = self._handleStartElementNss(name, attribs) nsuri = name[0] local = name[1] prefix = SplitQName(qname)[0] mapping = g_mappings.get(nsuri, None) del_extu = [] if mapping: if not mapping.has_key(local): if self._firstElement: raise XsltException(Error.STYLESHEET_ILLEGAL_ROOT, name) else: raise XsltException(Error.XSLT_ILLEGAL_ELEMENT, local) xsl_class = mapping[local] if xsl_class == IncludeElement: #Can the included sheet have literal result element as root? inc = self.clone().fromUri(nsattribs[('', 'href')], baseUri=self._ssheetUri, ownerDoc=self._ownerDoc) sty = inc.firstChild included_nss = GetAllNs(sty) for child in sty.childNodes[:]: self._nodeStack[-1].appendChild(child) #migrate old nss from stylesheet directly to new child for prefix in included_nss.keys(): if prefix: child.setAttributeNS(XMLNS_NAMESPACE, 'xmlns:'+prefix, included_nss[prefix]) else: child.setAttributeNS(XMLNS_NAMESPACE, 'xmlns', included_nss[prefix]) self._nodeStack.append(None) pDomlette.ReleaseNode(inc) return else: xsl_instance = xsl_class(self._ownerDoc, baseUri=self._ssheetUri) for aqname in nsattribs.getQNames(): (ansuri, alocal) = nsattribs.getNameByQName(aqname) value = nsattribs.getValueByQName(aqname) if ansuri != XMLNS_NAMESPACE and xsl_class == StylesheetElement: self._handleExtUris(ansuri, alocal, value, '', del_extu,xsl_instance) elif not ansuri and alocal not in xsl_instance.__class__.legalAttrs: raise XsltException(Error.XSLT_ILLEGAL_ATTR, aqname, xsl_instance.nodeName) xsl_instance.setAttributeNS(ansuri, aqname, value) else: if nsuri in self._extUris and self._extElements: #Default XsltElement behavior effects fallback ext_class = self._extElements.get((nsuri, local), XsltElement) xsl_instance = ext_class(self._ownerDoc, nsuri, local, prefix, self._ssheetUri) else: xsl_instance = LiteralElement(self._ownerDoc, nsuri, local, prefix, self._ssheetUri) for aqname in nsattribs.getQNames(): (ansuri, alocal) = nsattribs.getNameByQName(aqname) value = nsattribs.getValueByQName(aqname) if ansuri != XMLNS_NAMESPACE: self._handleExtUris(ansuri, alocal, value, '', del_extu, xsl_instance) if hasattr(xsl_instance.__class__, 'legalAttrs'): if not ansuri and alocal not in xsl_instance.__class__.legalAttrs: raise XsltException(Error.XSLT_ILLEGAL_ATTR, alocal, xsl_instance.nodeName) xsl_instance.setAttributeNS(ansuri, aqname, value) self._extUriStack.append(del_extu) if (xsl_instance.namespaceURI, xsl_instance.localName) == (XSL_NAMESPACE, 'text') or xsl_instance.getAttributeNS(XML_NAMESPACE, 'space') == 'preserve': self._preserveStateStack.append(1) elif xsl_instance.getAttributeNS(XML_NAMESPACE, 'space') == 'default': self._preserveStateStack.append(0) else: self._preserveStateStack.append(self._preserveStateStack[-1]) if self._firstElement: self._initializeSheet(xsl_instance) self._nodeStack.append(xsl_instance) return
def startElement(self, name, attribs): self._completeTextNode() (name, qname, nsattribs) = self._handleStartElementNss(name, attribs) nsuri = name[0] local = name[1] prefix = SplitQName(qname)[0] mapping = g_mappings.get(nsuri, None) del_extu = [] if mapping: if not mapping.has_key(local): if self._firstElement: raise XsltException(Error.STYLESHEET_ILLEGAL_ROOT, name) else: raise XsltException(Error.XSLT_ILLEGAL_ELEMENT, local) xsl_class = mapping[local] if xsl_class == IncludeElement: #Can the included sheet have literal result element as root? inc = self.clone().fromUri(nsattribs[('', 'href')], baseUri=self._ssheetUri, ownerDoc=self._ownerDoc) sty = inc.firstChild included_nss = GetAllNs(sty) for child in sty.childNodes[:]: self._nodeStack[-1].appendChild(child) #migrate old nss from stylesheet directly to new child for prefix in included_nss.keys(): if prefix: child.setAttributeNS(XMLNS_NAMESPACE, 'xmlns:' + prefix, included_nss[prefix]) else: child.setAttributeNS(XMLNS_NAMESPACE, 'xmlns', included_nss[prefix]) self._nodeStack.append(None) pDomlette.ReleaseNode(inc) return else: xsl_instance = xsl_class(self._ownerDoc, baseUri=self._ssheetUri) for aqname in nsattribs.getQNames(): (ansuri, alocal) = nsattribs.getNameByQName(aqname) value = nsattribs.getValueByQName(aqname) if ansuri != XMLNS_NAMESPACE and xsl_class == StylesheetElement: self._handleExtUris(ansuri, alocal, value, '', del_extu, xsl_instance) elif not ansuri and alocal not in xsl_instance.__class__.legalAttrs: raise XsltException(Error.XSLT_ILLEGAL_ATTR, aqname, xsl_instance.nodeName) xsl_instance.setAttributeNS(ansuri, aqname, value) else: if nsuri in self._extUris and self._extElements: #Default XsltElement behavior effects fallback ext_class = self._extElements.get((nsuri, local), XsltElement) xsl_instance = ext_class(self._ownerDoc, nsuri, local, prefix, self._ssheetUri) else: xsl_instance = LiteralElement(self._ownerDoc, nsuri, local, prefix, self._ssheetUri) for aqname in nsattribs.getQNames(): (ansuri, alocal) = nsattribs.getNameByQName(aqname) value = nsattribs.getValueByQName(aqname) if ansuri != XMLNS_NAMESPACE: self._handleExtUris(ansuri, alocal, value, '', del_extu, xsl_instance) if hasattr(xsl_instance.__class__, 'legalAttrs'): if not ansuri and alocal not in xsl_instance.__class__.legalAttrs: raise XsltException(Error.XSLT_ILLEGAL_ATTR, alocal, xsl_instance.nodeName) xsl_instance.setAttributeNS(ansuri, aqname, value) self._extUriStack.append(del_extu) if (xsl_instance.namespaceURI, xsl_instance.localName) == ( XSL_NAMESPACE, 'text') or xsl_instance.getAttributeNS( XML_NAMESPACE, 'space') == 'preserve': self._preserveStateStack.append(1) elif xsl_instance.getAttributeNS(XML_NAMESPACE, 'space') == 'default': self._preserveStateStack.append(0) else: self._preserveStateStack.append(self._preserveStateStack[-1]) if self._firstElement: self._initializeSheet(xsl_instance) self._nodeStack.append(xsl_instance) return
def DomConvert(node, xslParent, xslDoc, extUris, extElements, preserveSpace): if node.nodeType == Node.ELEMENT_NODE: mapping = g_mappings.get(node.namespaceURI, None) if mapping: if not mapping.has_key(node.localName): raise XsltException(Error.XSLT_ILLEGAL_ELEMENT, node.localName) xsl_class = mapping[node.localName] xsl_instance = xsl_class(xslDoc, baseUri=xslParent.baseUri) for attr in node.attributes.values(): if not attr.namespaceURI and attr.localName not in xsl_instance.__class__.legalAttrs: raise XsltException(Error.XSLT_ILLEGAL_ATTR, attr.nodeName, xsl_instance.nodeName) xsl_instance.setAttributeNS(attr.namespaceURI, attr.nodeName, attr.value) xslParent.appendChild(xsl_instance) elif node.namespaceURI in extUris: name = (node.namespaceURI, node.localName) if name in extElements.keys(): ext_class = extElements[name] else: #Default XsltElement behavior effects fallback ext_class = XsltElement xsl_instance = ext_class(xslDoc, node.namespaceURI, node.localName, node.prefix, xslParent.baseUri) for attr in node.attributes.values(): if (attr.namespaceURI, attr.localName) == (XSL_NAMESPACE, 'extension-element-prefixes'): ext_prefixes = string.splitfields(attr.value) for prefix in ext_prefixes: if prefix == '#default': prefix = '' extUris.append(node_nss[prefix]) xsl_instance.setAttributeNS(attr.namespaceURI, attr.nodeName, attr.value) xslParent.appendChild(xsl_instance) else: xsl_instance = LiteralElement(xslDoc, node.namespaceURI, node.localName, node.prefix, xslParent.baseUri) node_nss = GetAllNs(node) for attr in node.attributes.values(): if (attr.namespaceURI, attr.localName) == (XSL_NAMESPACE, 'extension-element-prefixes'): ext_prefixes = string.splitfields(attr.value) for prefix in ext_prefixes: if prefix == '#default': prefix = '' extUris.append(node_nss[prefix]) xsl_instance.setAttributeNS(attr.namespaceURI, attr.nodeName, attr.value) xslParent.appendChild(xsl_instance) ps = (xsl_instance.namespaceURI, xsl_instance.localName) == ( XSL_NAMESPACE, 'text') or xsl_instance.getAttributeNS( XML_NAMESPACE, 'space') == 'preserve' #ps = (xsl_instance.namespaceURI, xsl_instance.localName) == (XSL_NAMESPACE, 'text') for child in node.childNodes: DomConvert(child, xsl_instance, xslDoc, extUris, extElements, ps) elif node.nodeType == Node.TEXT_NODE: if string.strip(node.data) or preserveSpace: xsl_instance = LiteralText(xslDoc, node.data) xslParent.appendChild(xsl_instance) return