Project

Profile

Help

PyXdmValue creation and population

Added by Martin Honnen 12 months ago

For me, both under Windows and Linux code like

from saxonche import PySaxonProcessor, PyXdmValue

with PySaxonProcessor() as saxon_proc:
    xdm_value = PyXdmValue()

    #print(xdm_value)

    xdm_value.add_xdm_item(saxon_proc.make_string_value('foo'))

    print(xdm_value)

    xdm_value.add_xdm_item(saxon_proc.make_string_value('bar'))

    print(xdm_value)

crashes, on Windows I get some

Traceback (most recent call last):
  File "C:\Users\marti\PycharmProjects\SaxonC12PyXdmValueTest1\main.py", line 10, in <module>
    print(xdm_value)
TypeError: __str__ returned non-string (type NoneType)

Process finished with exit code -1073740940 (0xC0000374)

under Linux a segmentation fault.

What is the right way to create a PyXdmValue sequence of strings?


Replies (5)

Please register to reply

RE: PyXdmValue creation and population - Added by O'Neil Delpratt 12 months ago

This is a bug. I have created the following bug issue to keep track of its progress #6324 Thanks for reporting it.

RE: PyXdmValue creation and population - Added by Martin Honnen 12 months ago

Thanks, O'Neil.

What I was trying to do was to create a sequence/a PyXdmValue and pass it to XSLT as a parameter, for instance like in this code:

from saxonche import PySaxonProcessor, PyXdmValue

with PySaxonProcessor() as saxon_proc:

    #xdm_seq = saxon_proc.new_xpath_processor().evaluate('"foo", "bar"')

    xdm_seq = PyXdmValue()
    
    xdm_seq.add_xdm_item(saxon_proc.make_string_value('test1'))

    xdm_seq.add_xdm_item(saxon_proc.make_string_value('test2'))


    xslt30_processor = saxon_proc.new_xslt30_processor()

    xslt30_executable = xslt30_processor.compile_stylesheet(stylesheet_file=r'sample1.xsl')

    xslt30_executable.set_parameter('image-names', xdm_seq)

    xslt_result = xslt30_executable.call_template_returning_value()

    print(xslt_result)

This doesn't work, instead (under Windows, at least,) gives an error

java.lang.IllegalArgumentException: Invalid handle
    at com.oracle.svm.core.handles.ObjectHandlesImpl.doGet(ObjectHandlesImpl.java:232)
    at com.oracle.svm.core.handles.ObjectHandlesImpl.get(ObjectHandlesImpl.java:220)
    at net.sf.saxon.option.cpp.ProcessorDataAccumulator.addProcessorValue(ProcessorDataAccumulator.java:139)

I can't tell from the bug https://saxonica.plan.io/issues/6324 you have created if the above will work once that bug is fixed or whether there is an additional problem. I hope you can investigate that as well, at least once you have a fix for https://saxonica.plan.io/issues/6324.

A sample stylesheet for the above Python code is e.g.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:axsl="http://www.w3.org/1999/XSL/Transform-alias"
  version="3.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="#all">
  
  <xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/>
  
  <xsl:param name="image-names" as="xs:string*" select="'ABC', 'MNO'"/>

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/" name="xsl:initial-template">
    <axsl:stylesheet version="3.0">
      <axsl:template name="Dunning">
        <axsl:param name="Image"/>
        <axsl:choose>
            <axsl:when test="$Image = '{$image-names[1]}'">
                <axsl:text>Found</axsl:text>
            </axsl:when>
            <axsl:when test="$Image = '{$image-names[2]}'">
                <axsl:text>NotFound</axsl:text>
            </axsl:when>
        </axsl:choose>
     </axsl:template>
    </axsl:stylesheet>
  </xsl:template>

</xsl:stylesheet>

RE: PyXdmValue creation and population - Added by O'Neil Delpratt 12 months ago

Thanks for the update. For the first issue the problem is the reference count is not being incremented when an XdmItem is added to the XdmValue using add_xdm_item. I have fixed the issue and will update the bug issue. The workaround is to create an XdmAtomicValue with a variable.

For the following code:

xdm_value.add_xdm_item(saxon_proc.make_string_value('foo'))

The workaround works for me:

avalue = saxon_proc.make_string_value('foo')
    xdm_value.add_xdm_item(avalue)

RE: PyXdmValue creation and population - Added by O'Neil Delpratt 12 months ago

RE: PyXdmValue creation and population is relating to the same issue.

workaround:

from saxoncee import PySaxonProcessor, PyXdmValue

with PySaxonProcessor() as saxon_proc:

    #xdm_seq = saxon_proc.new_xpath_processor().evaluate('"foo", "bar"')

    xdm_seq = PyXdmValue()
    avalue1 = saxon_proc.make_string_value('test1')
    avalue2 = saxon_proc.make_string_value('test12')    
    xdm_seq.add_xdm_item(avalue1)

    xdm_seq.add_xdm_item(avalue2)


    xslt30_processor = saxon_proc.new_xslt30_processor()

    xslt30_executable = xslt30_processor.compile_stylesheet(stylesheet_file=r'sample1.xsl')

    xslt30_executable.set_parameter('image-names', xdm_seq)

    xslt_result = xslt30_executable.call_template_returning_value()

    print(xslt_result)

but this will be fixed in the next maintenance release.

RE: PyXdmValue creation and population - Added by Martin Honnen 12 months ago

Thanks again, O'Neil,

that workaround indeed works fine.

Interestingly enough if I try to reuse a single variable e.g.

    xdm_seq = PyXdmValue()

    xdm_string = saxon_proc.make_string_value('DEF')

    xdm_seq.add_xdm_item(xdm_string)

    xdm_string = saxon_proc.make_string_value('PQR')

    xdm_seq.add_xdm_item(xdm_string)

    xslt30_executable.set_parameter('image-names', xdm_seq)

    stylesheet_result = xslt30_executable.call_template_returning_value()

    print(stylesheet_result)

I get the same or very similar error I mentioned in https://saxonica.plan.io/boards/4/topics/9589?r=9591#message-9591:

java.lang.IllegalArgumentException: Invalid handle
    at com.oracle.svm.core.handles.ObjectHandlesImpl.doGet(ObjectHandlesImpl.java:232)
    at com.oracle.svm.core.handles.ObjectHandlesImpl.get(ObjectHandlesImpl.java:220)
    at net.sf.saxon.option.cpp.ProcessorDataAccumulator.addProcessorValue(ProcessorDataAccumulator.java:139)
    (1-5/5)

    Please register to reply