コード例 #1
0
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
コード例 #2
0
ファイル: ForEachElement.py プロジェクト: H1d3r/binary_blobs
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
コード例 #3
0
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
コード例 #4
0
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