Search code examples
saxons9api

Saxonia s9api integrated Extension functions Provide node


we are trying to submit a node using the integrated extension function. The node looks correct as far as it goes, but we can't access the individual elements, because there is always an outOfBound exception appearance.

How can we access the individual elements below the root element?

public ExtensionFunction updateTempNode = new ExtensionFunction() {
        public QName getName() {
            return new QName("de.dkl.dymoServer.util.ExternalFunctions", "updateTempNode");
        }

        public SequenceType getResultType() {
            return SequenceType.makeSequenceType(
                    ItemType.BOOLEAN, OccurrenceIndicator.ONE
            );
        }

        public net.sf.saxon.s9api.SequenceType[] getArgumentTypes() {
            return new SequenceType[]{
                    SequenceType.makeSequenceType(
                            ItemType.STRING, OccurrenceIndicator.ONE),
                    SequenceType.makeSequenceType(
                            ItemType.DOCUMENT_NODE, OccurrenceIndicator.ONE)};
        }

        public XdmValue call(XdmValue[] arguments) {
            String sessionId = arguments[0].itemAt(0).getStringValue();
            SaplingElement tempNode = TransformationService.tempNodes.get(sessionId);
            ItemTypeFactory itemTypeFactory = new ItemTypeFactory(((XdmNode) arguments[1]).getProcessor());
            tempNode.withChild(
                    arguments[1].stream().map(xdmValue -> Saplings.elem(xdmValue.getStringValue()).withText(xdmValue.itemAt(0).getStringValue())).toList()
                            .toArray(SaplingElement[]::new)
            );
            System.out.println(tempNode);

            return new XdmAtomicValue(true);
        }
    };

AOOB as I try to iterate

Data expected as document_node


Solution

  • Wild guess is that you want something like

    tempNode = tempNode.withChild(
                    arguments[1]
                    
     .select(Steps.child().then(Steps.child()))
                                .map(childNode -> Saplings.elem(childNode.getNodeName()).withText(childNode.itemAt(0).getStringValue()))
    .collect(Collectors.toList())
                                .toArray(new SaplingElement[]{})
                );
    

    which would populate tempNode with copies of the child nodes of the root element of the document node that is arguments[1]. There might be better ways to do that. .