def _run(self, node, parameters=None, result=None): """ Runs the stylesheet processor against the given XML DOM node with the stylesheets that have been registered. It does not mutate the source. If writer is given, it is used in place of the default output method decisions for choosing the proper writer. """ #QUESTION: What about ws stripping? #ANSWER: Whitespace stripping happens only in the run*() interfaces. # This method is use-at-your-own-risk. The XSLT conformance of the # source is maintained by the caller. This exists as a performance # hook. parameters = parameters or {} self.attributeSets = {} self.keys = {} #See f:chain-to extension element self.chainTo = None self.chainParams = None if not self.transform: raise XsltError(XsltError.NO_STYLESHEET) # Use an internal result to gather the output only if the caller # didn't supply other means of retrieving it. if result is None: result = stringresult() result.parameters = self.transform.output_parameters assert result.writer # Initialize any stylesheet parameters initial_variables = parameters.copy() for name in parameters: if name not in self.transform.parameters: del initial_variables[name] # Prepare the stylesheet for processing context = xsltcontext.xsltcontext(node, variables=initial_variables, transform=self.transform, processor=self, extfunctions=self._extfunctions, output_parameters=result.parameters) context.add_document(node, node.xml_base) context.push_writer(result.writer) self.transform.root.prime(context) # Process the document try: self.transform.apply_templates(context, [node]) except XPathError, e: raise instruction = context.instruction strerror = str(e) e.message = MessageSource.EXPRESSION_POSITION_INFO % ( instruction.baseUri, instruction.lineNumber, instruction.columnNumber, instruction.nodeName, strerror) raise
def _run(self, node, parameters=None, result=None): """ Runs the stylesheet processor against the given XML DOM node with the stylesheets that have been registered. It does not mutate the source. If writer is given, it is used in place of the default output method decisions for choosing the proper writer. """ #QUESTION: What about ws stripping? #ANSWER: Whitespace stripping happens only in the run*() interfaces. # This method is use-at-your-own-risk. The XSLT conformance of the # source is maintained by the caller. This exists as a performance # hook. parameters = parameters or {} self.attributeSets = {} self.keys = {} #See f:chain-to extension element self.chainTo = None self.chainParams = None if not self.transform: raise XsltError(XsltError.NO_STYLESHEET) # Use an internal result to gather the output only if the caller # didn't supply other means of retrieving it. if result is None: result = stringresult() result.parameters = self.transform.output_parameters assert result.writer # Initialize any stylesheet parameters initial_variables = parameters.copy() for name in parameters: if name not in self.transform.parameters: del initial_variables[name] # Prepare the stylesheet for processing context = xsltcontext.xsltcontext(node, variables=initial_variables, transform=self.transform, processor=self, extfunctions=self._extfunctions, output_parameters=result.parameters) context.add_document(node, node.xml_base) context.push_writer(result.writer) self.transform.root.prime(context) # Process the document try: self.transform.apply_templates(context, [node]) except XPathError, e: raise instruction = context.instruction strerror = str(e) e.message = MessageSource.EXPRESSION_POSITION_INFO % ( instruction.baseUri, instruction.lineNumber, instruction.columnNumber, instruction.nodeName, strerror) raise
def __missing__(self, key): assert isinstance(key, tree.entity), key values = collections.defaultdict(set) context = xsltcontext.xsltcontext(key, 1, 1) for value, node in self._match_nodes(context, [key]): values[value].add(node) # Now store the unique nodes as an XPath nodeset values = self[key] = dict(values) for value, nodes in values.iteritems(): values[value] = datatypes.nodeset(nodes) return values
def __missing__(self, key): assert isinstance(key, tree.entity), key values = collections.defaultdict(set) context = xsltcontext.xsltcontext(key, 1, 1) for value, node in self._match_nodes(context, [key]): values[value].add(node) # Now store the unique nodes as an XPath nodeset values = self[key] = dict(values) for value, nodes in values.iteritems(): values[value] = datatypes.nodeset(nodes) return values