class ForEachElement(XsltElement): category = CategoryTypes.INSTRUCTION content = ContentInfo.Seq( ContentInfo.Rep(ContentInfo.QName(XSL_NAMESPACE, 'xsl:sort')), ContentInfo.Template) legalAttrs = { 'select': AttributeInfo.NodeSetExpression(required=1), } doesSetup = 1 def setup(self): sort_keys = filter(lambda x: isinstance(x, SortElement), self.children) if sort_keys: self._select = SortedExpression(self._select, sort_keys) return def instantiate(self, context, processor): context.processorNss = self.namespaces context.currentInstruction = self if self._select: node_set = self._select.evaluate(context) if type(node_set) != type([]): raise XsltRuntimeException(Error.INVALID_FOREACH_SELECT, self) else: node_set = context.node.childNodes state = context.copy() pos = 1 size = len(node_set) for node in node_set: context.node, context.position, context.size = node, pos, size context.currentNode = node for child in self.children: child.instantiate(context, processor) pos += 1 context.set(state) return
class ForEachElement(XsltElement): category = CategoryTypes.INSTRUCTION content = ContentInfo.Seq( ContentInfo.Rep(ContentInfo.QName(XSL_NAMESPACE, 'xsl:sort')), ContentInfo.Template) legalAttrs = { 'select' : AttributeInfo.NodeSetExpression(required=1), } doesSetup = 1 def setup(self): sort_keys = filter(lambda x: isinstance(x, SortElement), self.children) if sort_keys: self._select = SortedExpression(self._select, sort_keys) return def instantiate(self, context, processor): context.processorNss = self.namespaces context.currentInstruction = self if self._select: node_set = self._select.evaluate(context) if type(node_set) != type([]): raise XsltRuntimeException(Error.INVALID_FOREACH_SELECT, self) else: node_set = context.node.childNodes state = context.copy() pos = 1 size = len(node_set) for node in node_set: context.node, context.position, context.size = node, pos, size context.currentNode = node for child in self.children: child.instantiate(context, processor) pos += 1 context.set(state) return
class ApplyTemplatesElement(XsltElement): category = CategoryTypes.INSTRUCTION content = ContentInfo.Rep( ContentInfo.Alt(ContentInfo.QName(XSL_NAMESPACE, 'xsl:sort'), ContentInfo.QName(XSL_NAMESPACE, 'xsl:with-param'))) legalAttrs = { 'select': AttributeInfo.Expression(), 'mode': AttributeInfo.QName(), } doesSetup = 1 def setup(self): sort_keys = [] self._params = [] for child in self.children: # only XSL children are guaranteed by the validation name = child.expandedName[1] if name == 'sort': sort_keys.append(child) elif name == 'with-param': self._params.append((child, child._name, child._select)) if sort_keys: self._select = SortedExpression(self._select, sort_keys) return # hooks for Fourthought extension element (mode as AVT) def _instantiate_mode(self, context): return self._mode def instantiate(self, context, processor): context.processorNss = self.namespaces context.currentInstruction = self with_params = {} for (param, name, expr) in self._params: context.processorNss = param.namespaces context.currentInstruction = param with_params[name] = expr.evaluate(context) if self._select: node_set = self._select.evaluate(context) # it must really be a node-set, and if XSLT 1.0, not a result tree fragment if not isinstance(node_set, list): raise XsltRuntimeException(Error.ILLEGAL_APPLYTEMPLATE_NODESET, self) else: node_set = context.node.childNodes # Iterate over the nodes state = context.copy() mode = context.mode context.mode = self._instantiate_mode(context) pos = 1 size = len(node_set) for node in node_set: context.node, context.position, context.size = node, pos, size processor.applyTemplates(context, with_params) pos += 1 context.mode = mode context.set(state) return
class ApplyTemplatesElement(XsltElement): category = CategoryTypes.INSTRUCTION content = ContentInfo.Rep( ContentInfo.Alt(ContentInfo.QName(XSL_NAMESPACE, 'xsl:sort'), ContentInfo.QName(XSL_NAMESPACE, 'xsl:with-param')) ) legalAttrs = { 'select' : AttributeInfo.Expression(), 'mode' : AttributeInfo.QName(), } doesSetup = 1 def setup(self): sort_keys = [] self._params = [] for child in self.children: # only XSL children are guaranteed by the validation name = child.expandedName[1] if name == 'sort': sort_keys.append(child) elif name == 'with-param': self._params.append((child, child._name, child._select)) if sort_keys: self._select = SortedExpression(self._select, sort_keys) return # hooks for Fourthought extension element (mode as AVT) def _instantiate_mode(self, context): return self._mode def instantiate(self, context, processor): context.processorNss = self.namespaces context.currentInstruction = self with_params = {} for (param, name, expr) in self._params: context.processorNss = param.namespaces context.currentInstruction = param with_params[name] = expr.evaluate(context) if self._select: node_set = self._select.evaluate(context) # it must really be a node-set, and if XSLT 1.0, not a result tree fragment if not isinstance(node_set, list): raise XsltRuntimeException( Error.ILLEGAL_APPLYTEMPLATE_NODESET, self) else: node_set = context.node.childNodes # Iterate over the nodes state = context.copy() mode = context.mode context.mode = self._instantiate_mode(context) pos = 1 size = len(node_set) for node in node_set: context.node, context.position, context.size = node, pos, size processor.applyTemplates(context, with_params) pos += 1 context.mode = mode context.set(state) return