Project

Profile

Help

Bug #4357

closed

XSLT using accumulator passes streamability analysis but crashed with java.lang.UnsupportedOperationException: net.sf.saxon.trans.XPathException: Navigation using preceding-sibling axis is not supported from a streamed input node

Added by Martin Honnen over 4 years ago. Updated over 4 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Category:
Streaming
Sprint/Milestone:
-
Start date:
2019-10-22
Due date:
% Done:

0%

Estimated time:
Legacy ID:
Applies to branch:
9.8, 9.9, trunk
Fix Committed on Branch:
9.9, trunk
Fixed in Maintenance Release:
Platforms:

Description

I tried to solve a problem from the XSL list using streaming and an accumulator but both Saxon 9.9 EE and Saxon 9.8 EE crash running it.

The code:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">
    
    <xsl:mode on-no-match="shallow-copy" streamable="yes" use-accumulators="rev-change"/>
    
    <xsl:accumulator name="rev-change" as="xs:boolean" initial-value="false()" streamable="yes">
        <xsl:accumulator-rule match="topic" select="false()"/>
        <xsl:accumulator-rule match="topic/revst" select="true()"/>
        <xsl:accumulator-rule match="topic/revend" select="false()"/>
    </xsl:accumulator>
    
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>
  
    <xsl:template match="topic/*[accumulator-before('rev-change')]">
        <xsl:copy>
            <xsl:attribute name="rev">changed</xsl:attribute>
            <xsl:apply-templates select="@*"/>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="revst | revend" priority="2"/>
    
</xsl:stylesheet>

Example input:

<root>

    <topic id="idm140322603719792">

        <chgdesc revnbr="42">Content</chgdesc>

        <title line-break="0">Content</title>

        <revst/>

        <para>Content</para>

        <revend/>

        <para>Content</para>

        <revst/>

        <note>

            <para>Content</para>

        </note>

        <revend/>

        <para>Content</para>

        <revst/>

        <para>Content</para>

        <para>Content</para>

        <revend/>

    </topic>

</root>

Stack trace of Saxon 9.9.1.5 EE Java:

java.lang.UnsupportedOperationException: net.sf.saxon.trans.XPathException: Navigation using preceding-sibling axis is not supported from a streamed input node
        at com.saxonica.ee.stream.om.FleetingNode.iterateAxis(FleetingNode.java:512)
        at com.saxonica.ee.stream.om.FleetingElementNode.iterateAxis(FleetingElementNode.java:98)
        at net.sf.saxon.tree.util.Navigator.getSiblingPosition(Navigator.java:1136)
        at net.sf.saxon.pattern.GeneralPositionalPattern.getActualPosition(GeneralPositionalPattern.java:273)
        at net.sf.saxon.pattern.GeneralPositionalPattern.internalMatches(GeneralPositionalPattern.java:242)
        at net.sf.saxon.pattern.GeneralPositionalPattern.matchesBeneathAnchor(GeneralPositionalPattern.java:222)
        at net.sf.saxon.pattern.AncestorQualifiedPattern.matchesBeneathAnchor(AncestorQualifiedPattern.java:211)
        at net.sf.saxon.pattern.AncestorQualifiedPattern.matches(AncestorQualifiedPattern.java:193)
        at net.sf.saxon.trans.rules.Rule.matches(Rule.java:255)
        at com.saxonica.ee.trans.ModeEE.ruleMatches(ModeEE.java:133)
        at net.sf.saxon.trans.SimpleMode.searchRuleChain(SimpleMode.java:661)
        at net.sf.saxon.trans.SimpleMode.getRule(SimpleMode.java:547)
        at com.saxonica.ee.stream.watch.ApplyTemplatesAction.getRule(ApplyTemplatesAction.java:260)
        at com.saxonica.ee.stream.watch.ApplyTemplatesAction.startSelectedParentNode(ApplyTemplatesAction.java:144)
        at com.saxonica.ee.stream.watch.Trigger.startSelectedParentNode(Trigger.java:85)
        at com.saxonica.ee.stream.watch.WatchManager.startElement(WatchManager.java:274)
        at net.sf.saxon.event.StartTagBuffer.startContent(StartTagBuffer.java:246)
        at com.saxonica.ee.stream.ContentDetector.flush(ContentDetector.java:97)
        at com.saxonica.ee.stream.ContentDetector.startElement(ContentDetector.java:33)
        at net.sf.saxon.event.Stripper.startElement(Stripper.java:115)
        at net.sf.saxon.event.ReceivingContentHandler.startElement(ReceivingContentHandler.java:367)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown Source)
        at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
        at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
        at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
        at net.sf.saxon.event.Sender.sendSAXSource(Sender.java:435)
        at net.sf.saxon.event.Sender.send(Sender.java:167)
        at net.sf.saxon.trans.XsltController.applyStreamingTemplates(XsltController.java:1050)
        at net.sf.saxon.s9api.AbstractXsltTransformer.applyTemplatesToSource(AbstractXsltTransformer.java:339)
        at net.sf.saxon.s9api.Xslt30Transformer.applyTemplates(Xslt30Transformer.java:311)
        at net.sf.saxon.Transform.processFile(Transform.java:1283)
        at net.sf.saxon.Transform.doTransform(Transform.java:815)
        at net.sf.saxon.Transform.main(Transform.java:80)
Caused by: net.sf.saxon.trans.XPathException: Navigation using preceding-sibling axis is not supported from a streamed input node
        at com.saxonica.ee.stream.om.FleetingNode.iterateAxis(FleetingNode.java:509)
        ... 39 more
Fatal error during transformation: java.lang.UnsupportedOperationException: net.sf.saxon.trans.XPathException: Navigation using preceding-sibling axis is not supported from a streamed input node

The code works fine with Saxon 9.9.1.5 HE, i.e. not using streaming.


Related issues

Has duplicate Saxon - Bug #4362: positional predicate not recognized by streamability analysis: execution fails with java.lang.UnsupportedOperationException: net.sf.saxon.trans.XPathException: Navigation using preceding-sibling axis is not supported from a streamed input nodeDuplicateMichael Kay2019-10-26

Actions

Please register to edit this issue

Also available in: Atom PDF