Saxonica Developer Community: Issueshttps://saxonica.plan.io/https://saxonica.plan.io/favicon.ico2024-01-29T17:52:37ZSaxonica Developer Community
Planio SaxonC - Bug #6333 (In Progress): Representing empty sequencehttps://saxonica.plan.io/issues/63332024-01-29T17:52:37ZO'Neil Delprattoneil@saxonica.com
<p>SaxonC currently does not properly represent empty sequences via the API. What we need is an <code>XdmEmptySequence</code> class similar to its Java counterpart. Moreover, In SaxonJ (Java) an empty <code>XdmValue</code> is also an empty sequence which can be passed as a parameter to an expression of stylesheet, but this fails in SaxonC.</p>
<p>For example:</p>
<pre><code class="python syntaxhl" data-language="python"> <span class="n">xp</span> <span class="o">=</span> <span class="n">saxonproc</span><span class="p">.</span><span class="n">new_xpath_processor</span><span class="p">()</span>
<span class="n">xp</span><span class="p">.</span><span class="n">declare_namespace</span><span class="p">(</span><span class="s">"fn"</span><span class="p">,</span> <span class="s">"http://www.w3.org/2005/xpath-functions"</span><span class="p">)</span>
<span class="n">xp</span><span class="p">.</span><span class="n">declare_variable</span><span class="p">(</span><span class="s">'p'</span><span class="p">)</span>
<span class="n">xdm_value</span> <span class="o">=</span> <span class="n">PyXdmValue</span><span class="p">()</span>
<span class="n">xp</span><span class="p">.</span><span class="n">set_parameter</span><span class="p">(</span><span class="s">'p'</span><span class="p">,</span> <span class="n">xdm_value</span><span class="p">)</span>
<span class="k">assert</span> <span class="n">xp</span><span class="p">.</span><span class="n">effective_boolean_value</span><span class="p">(</span><span class="s">"fn:empty($p)"</span><span class="p">)</span>
</code></pre>
<p>Crashes out with the following exception:</p>
<pre><code>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.addProcessorDataPair(ProcessorDataAccumulator.java:93)
</code></pre>
<p>This is probably because the empty <code>PyXdmValue()</code> object is not internally getting converted to an empty sequence.</p> SaxonC - Bug #6325 (New): saxonche.PySaxonApiError: Null found in Java string conversation. Line ...https://saxonica.plan.io/issues/63252024-01-19T12:32:10ZO'Neil Delprattoneil@saxonica.com
<p>Reported by user via email.</p>
<p>The user is migrating from saxonpy to saxonche.</p>
<p>Error reported:</p>
<pre><code>saxonche.PySaxonApiError: Null found in Java string conversation. Line number: -1
</code></pre>
<p>You can find the Git repository with the relevant files and code here:</p>
<p><a href="https://github.com/sirisha09-till/xml2dita/tree/main/xml2dita" class="external">https://github.com/sirisha09-till/xml2dita/tree/main/xml2dita</a></p> SaxonC - Bug #6299 (New): Add a Makefile to the release for building of the SaxonC C/C++ API libraryhttps://saxonica.plan.io/issues/62992023-12-20T13:02:23ZO'Neil Delprattoneil@saxonica.com
<p>Reported by user here <a href="https://stackoverflow.com/questions/77684816/undefined-reference-error-when-link-to-saxon-library-in-c/77690492#77690492" class="external">https://stackoverflow.com/questions/77684816/undefined-reference-error-when-link-to-saxon-library-in-c/77690492#77690492</a></p>
<p>The SaxonC release should contain a MakeFile to build the C/C++ library. This is something we attempted to do long time ago, but for some reason we proceed with its use. Since we are now using Graalvm we should use a Makefile.</p> SaxonC - Bug #6297 (New): 12.4.1 command build errors on CentOS 7https://saxonica.plan.io/issues/62972023-12-19T11:50:46ZTony Graham
<p>Running <code>build-saxonc-commands.sh</code> on CentOS 7 generated errors about the C version, such as:</p>
<pre><code>Transform.c: In function ‘transform’:
Transform.c:33:3: error: ‘for’ loop initial declarations are only allowed in C99 mode
for (int i = 1; i < argc; i++) {
^
Transform.c:33:3: note: use option -std=c99 or -std=gnu99 to compile your code
</code></pre>
<p>After adding <code>-std=c99</code> to the GCC command lines, there were errors about <code>int64_t</code>, such as:</p>
<pre><code>In file included from ../Saxon.C.API/SaxonCGlue.c:1:0:
../Saxon.C.API/SaxonCGlue.h:92:3: error: unknown type name ‘int64_t’
int64_t value; /*!< Internal use only. The value of the parameter points
^
</code></pre>
<p>That was worked around by adding <code>#include <stdint.h></code> for <code>__LINUX__</code> and <code>__APPLE__</code> in <code>SaxonCGlue.h</code>. I don't know whether <code>#include <stdint.h></code> would be necessary for <code>__APPLE__</code>.</p>
<p>Also, it's not clear why <code>#include <stdio.h></code> is included a second time for <code>__LINUX__</code> and <code>__APPLE__</code>.</p>
<pre><code class="diff syntaxhl" data-language="diff"><span class="gd">--- build-saxonc-commands.sh~ 2023-12-01 12:17:46.000000000 +0000
</span><span class="gi">+++ build-saxonc-commands.sh 2023-12-19 08:52:51.329869064 +0000
</span><span class="p">@@ -4,15 +4,15 @@</span>
parent_path=$( cd "$(dirname "$0")" ; pwd -P )
library_dir=${1-$(pwd -P)}/../libs/nix
#cd "$parent_path"
<span class="gd">-gcc -m64 -fPIC -I../Saxon.C.API/graalvm -c ../Saxon.C.API/SaxonCGlue.c -o SaxonCGlue.o $1
</span><span class="gi">+gcc -std=c99 -m64 -fPIC -I../Saxon.C.API/graalvm -c ../Saxon.C.API/SaxonCGlue.c -o SaxonCGlue.o $1
</span>
<span class="gd">-gcc -m64 -fPIC -I../Saxon.C.API/graalvm Transform.c -o transform -ldl -lc SaxonCGlue.o -L$library_dir -lsaxon-hec-12.4.1 $1
</span><span class="gi">+gcc -std=c99 -m64 -fPIC -I../Saxon.C.API/graalvm Transform.c -o transform -ldl -lc SaxonCGlue.o -L$library_dir -lsaxon-hec-12.4.1 $1
</span>
<span class="gd">-gcc -m64 -fPIC -I../Saxon.C.API/graalvm Query.c -o query -ldl -lc SaxonCGlue.o -L$library_dir -lsaxon-hec-12.4.1 $1
</span><span class="gi">+gcc -std=c99 -m64 -fPIC -I../Saxon.C.API/graalvm Query.c -o query -ldl -lc SaxonCGlue.o -L$library_dir -lsaxon-hec-12.4.1 $1
</span>
<span class="gd">-gcc -m64 -fPIC -I../Saxon.C.API/graalvm Gizmo.c -o gizmo -ldl -lc SaxonCGlue.o -L$library_dir -lsaxon-hec-12.4.1 $1
</span><span class="gi">+gcc -std=c99 -m64 -fPIC -I../Saxon.C.API/graalvm Gizmo.c -o gizmo -ldl -lc SaxonCGlue.o -L$library_dir -lsaxon-hec-12.4.1 $1
</span>
if [ -f Validate.c ]; then
<span class="gd">- gcc -m64 -fPIC -I../Saxon.C.API/graalvm Validate.c -o validate -ldl -lc SaxonCGlue.o -L$library_dir -lsaxon-hec-12.4.1 $1
</span><span class="gi">+ gcc -std=c99 -m64 -fPIC -I../Saxon.C.API/graalvm Validate.c -o validate -ldl -lc SaxonCGlue.o -L$library_dir -lsaxon-hec-12.4.1 $1
</span> fi
</code></pre>
<pre><code class="diff syntaxhl" data-language="diff"><span class="gd">--- SaxonCGlue.h~ 2023-12-01 12:17:48.000000000 +0000
</span><span class="gi">+++ SaxonCGlue.h 2023-12-19 09:00:42.996931099 +0000
</span><span class="p">@@ -17,6 +17,7 @@</span>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
<span class="gi">+#include <stdint.h>
</span> #else
#include <stdint.h>
#include <windows.h>
</code></pre> SaxonC - Bug #6291 (New): Warnings for invalid keywords from transform_to_string methods on PyXsl...https://saxonica.plan.io/issues/62912023-12-15T15:06:24ZDebbie Lockettdebbie@saxonica.com
<p>The documentation for the <code>PyXslt30Processor</code> <code>transform_to_string</code> method says that the keywords <code>source_file</code> and <code>stylesheet_file</code> are required. The method currently raises a warning only when <code>len(kwds) == 0</code>. It would be better to raise a warning precisely when <code>source_file</code> and <code>stylesheet_file</code> are not both supplied.</p>
<p>Meanwhile for <code>transform_to_string</code> on <code>PyXsltExecutable</code>, there is some other confusion about supplied keywords. Here only one of <code>source_file</code> or <code>xdm_node</code> can be supplied, and a warning is raised if both are (I committed a change here yesterday to check for precisely both of these keywords, rather than <code>len(kwds) > 0</code>). (Note that it is OK to supply neither.) The other possible keywords are <code>base_output_uri</code> and <code>encoding</code>. It looks like you'll currently get a (unhelpfully worded) warning if you try to supply only <code>encoding</code> - but that should be permitted.</p> SaxonC - Bug #6276 (New): https://pypi.org/project/saxonche/ claims current print(proc.version) g...https://saxonica.plan.io/issues/62762023-12-02T10:58:42ZMartin Honnenmartin.honnen@gmx.de
<p>I am not sure this is a build problem/quirk or a documentation problem/quirk but <a href="https://pypi.org/project/saxonche/" class="external">https://pypi.org/project/saxonche/</a> claims current <code>print(proc.version)</code> would give <code>SaxonC-HE 12.4.1 from Saxonica</code> while even with 12.4.1 the output remains at <code>SaxonC-HE 12.4 from Saxonica</code>.</p>
<p>But the inconsistency between the documentation of the wheel on PyPi and its version number and the actual result might be confusing.</p> SaxonC - Bug #6182 (In Progress): UTF-8 in string based C API functionshttps://saxonica.plan.io/issues/61822023-08-22T16:25:00ZOmar Siam
<p>I tried to get the following code running and the encoding of the return value seems off.</p>
<pre><code class="cpp syntaxhl" data-language="cpp"><span class="kt">void</span> <span class="nf">testUTF8StringTemplate</span><span class="p">(</span><span class="n">SaxonProcessor</span> <span class="o">*</span><span class="n">proc</span><span class="p">,</span> <span class="n">Xslt30Processor</span> <span class="o">*</span><span class="n">trans</span><span class="p">,</span>
<span class="n">sResultCount</span> <span class="o">*</span><span class="n">sresult</span><span class="p">)</span> <span class="p">{</span>
<span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">source</span> <span class="o">=</span>
<span class="s">"<?xml version='1.0' encoding='UTF8'?> <xsl:stylesheet "</span>
<span class="s">"xmlns:xsl='http://www.w3.org/1999/XSL/Transform' "</span>
<span class="s">"xmlns:xs='http://www.w3.org/2001/XMLSchema' version='3.0'> "</span>
<span class="s">"<xsl:template match='*'> <xsl:sequence select='&apos;تيست&apos;'/> </xsl:template> </xsl:stylesheet>"</span><span class="p">;</span>
<span class="n">cout</span> <span class="o"><<</span> <span class="n">endl</span> <span class="o"><<</span> <span class="s">"Test:testUTF8StringTemplate"</span> <span class="o"><<</span> <span class="n">endl</span><span class="p">;</span>
<span class="n">XsltExecutable</span> <span class="o">*</span><span class="n">executable</span> <span class="o">=</span> <span class="n">trans</span><span class="o">-></span><span class="n">compileFromString</span><span class="p">(</span><span class="n">source</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">executable</span> <span class="o">==</span> <span class="nb">nullptr</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">trans</span><span class="o">-></span><span class="n">exceptionOccurred</span><span class="p">())</span> <span class="p">{</span>
<span class="n">cout</span> <span class="o"><<</span> <span class="s">"Error: "</span> <span class="o"><<</span> <span class="n">trans</span><span class="o">-></span><span class="n">getErrorMessage</span><span class="p">()</span> <span class="o"><<</span> <span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">return</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">_in</span> <span class="o">=</span> <span class="s">"<?xml version='1.0' encoding='UTF8'?><e>تيست</e>"</span><span class="p">;</span>
<span class="n">XdmNode</span> <span class="o">*</span><span class="n">node</span> <span class="o">=</span> <span class="n">proc</span><span class="o">-></span><span class="n">parseXmlFromString</span><span class="p">(</span><span class="n">_in</span><span class="p">);</span>
<span class="n">executable</span><span class="o">-></span><span class="n">setResultAsRawValue</span><span class="p">(</span><span class="nb">false</span><span class="p">);</span>
<span class="n">std</span><span class="o">::</span><span class="n">map</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">,</span> <span class="n">XdmValue</span> <span class="o">*></span> <span class="n">parameterValues</span><span class="p">;</span>
<span class="n">executable</span><span class="o">-></span><span class="n">setInitialTemplateParameters</span><span class="p">(</span><span class="n">parameterValues</span><span class="p">,</span> <span class="nb">false</span><span class="p">);</span>
<span class="n">executable</span><span class="o">-></span><span class="n">setInitialMatchSelection</span><span class="p">(</span><span class="n">node</span><span class="p">);</span>
<span class="n">XdmValue</span> <span class="o">*</span><span class="n">result</span> <span class="o">=</span> <span class="n">executable</span><span class="o">-></span><span class="n">applyTemplatesReturningValue</span><span class="p">();</span>
<span class="k">if</span> <span class="p">(</span><span class="n">result</span> <span class="o">!=</span> <span class="nb">nullptr</span><span class="p">)</span> <span class="p">{</span>
<span class="n">sresult</span><span class="o">-></span><span class="n">success</span><span class="o">++</span><span class="p">;</span>
<span class="n">cout</span> <span class="o"><<</span> <span class="s">"Input="</span> <span class="o"><<</span> <span class="n">_in</span><span class="p">;</span>
<span class="n">cout</span> <span class="o"><<</span> <span class="s">"Result="</span> <span class="o"><<</span> <span class="n">result</span><span class="o">-></span><span class="n">getHead</span><span class="p">()</span><span class="o">-></span><span class="n">getStringValue</span><span class="p">()</span> <span class="o"><<</span> <span class="n">endl</span> <span class="o"><<</span> <span class="n">node</span><span class="o">-></span><span class="n">toString</span><span class="p">()</span> <span class="o"><<</span> <span class="n">endl</span><span class="p">;</span>
<span class="k">delete</span> <span class="n">result</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="n">sresult</span><span class="o">-></span><span class="n">failure</span><span class="o">++</span><span class="p">;</span>
<span class="n">sresult</span><span class="o">-></span><span class="n">failureList</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="s">"testUTF8StringTemplate"</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">delete</span> <span class="n">executable</span><span class="p">;</span>
<span class="k">delete</span> <span class="n">node</span><span class="p">;</span>
<span class="n">parameterValues</span><span class="p">.</span><span class="n">clear</span><span class="p">();</span>
<span class="p">}</span>
</code></pre>
<pre><code class="shell syntaxhl" data-language="shell">Compiled with VS 2017:
cl /utf-8 /EHsc <span class="s2">"-I%graalvmdir%"</span> testXSLT30.cpp ../../Saxon.C.API/SaxonCGlue.c ../../Saxon.C.API/SaxonCXPath.c ../../Saxon.C.API/SaxonProcessor.cpp ../../Saxon.C.API/XdmValue.cpp ../../Saxon.C.API/XdmItem.cpp ../../Saxon.C.API/XdmAtomicValue.cpp ../../Saxon.C.API/DocumentBuilder.cpp ../../Saxon.C.API/XdmNode.cpp ../../Saxon.C.API/XdmFunctionItem.cpp ../../Saxon.C.API/XdmArray.cpp ../../Saxon.C.API/XdmMap.cpp ../../Saxon.C.API/SaxonApiException.cpp ../../Saxon.C.API/XQueryProcessor.cpp ../../Saxon.C.API/Xslt30Processor.cpp ../../Saxon.C.API/XsltExecutable.cpp ../../Saxon.C.API/XPathProcessor.cpp ../../Saxon.C.API/SchemaValidator.cpp /link ..<span class="se">\.</span>.<span class="se">\l</span>ibs<span class="se">\w</span><span class="k">in</span><span class="se">\l</span>ibsaxon-hec-12.3.lib
</code></pre>
<p>Result in an UTF-8 enabled powershell window:</p>
<pre><code>Test:testUTF8StringTemplate
Input=<?xml version='1.0' encoding='UTF8'?><e>تيست</e>Result=تيست
<e>تيست</e>
</code></pre>
<p>Any ideas how to fix this? It seems the UTF-8 string is encoded twice.</p> SaxonC - Bug #6120 (New): Unclear installation instruction for linking SaxonC library in C++https://saxonica.plan.io/issues/61202023-07-07T09:25:40ZO'Neil Delprattoneil@saxonica.com
<p>If a users want to compile a program that links against SaxonC the documentation does not make it clear enough how to do this. It should make it clear that either add the library to LIBRARY_PATH, or use -L to point
directly to the library.</p>
<p>At runtime, if the dynamic library has not been installed in “a standard
place”, the location needs to be set on the LD_LIBRARY_PATH.</p> SaxonC - Bug #6073 (In Progress): Documentation on the C API is missinghttps://saxonica.plan.io/issues/60732023-06-12T11:01:41ZO'Neil Delprattoneil@saxonica.com
<p>Reported by a user that the documentation on the C API is missing. We only have some example code available</p> SaxonC - Bug #6009 (In Progress): cppTests/testXSLT30 exampleTransformToString fails, probably du...https://saxonica.plan.io/issues/60092023-05-03T05:56:59ZMartin Honnenmartin.honnen@gmx.de
<p>Using SaxonC EE 12.2 under Linux, I find that one test of cppTests/testXSLT30 fails, namely then one named <code>exampleTransformToString</code> outputs e.g.</p>
<pre><code><b>exampleTransformToString:</b><br/>
baseURI = file:///home/mh/libsaxon-EEC-linux-v12.2/samples/cppTests
producing sheet
exampleTransformToString =
The file output.xml does not exist
</code></pre>
<p>where the baseURI is constructed and output with e.g.</p>
<pre><code class="cpp syntaxhl" data-language="cpp"> <span class="n">string</span> <span class="n">baseURI</span> <span class="o">=</span> <span class="n">string</span><span class="p">(</span><span class="s">"file://"</span><span class="p">)</span><span class="o">+</span><span class="n">sproc</span><span class="o">-></span><span class="n">getcwd</span><span class="p">();</span>
<span class="n">cerr</span><span class="o"><<</span><span class="s">"baseURI = "</span><span class="o"><<</span><span class="n">baseURI</span><span class="o"><<</span><span class="n">endl</span><span class="p">;</span>
<span class="n">executable</span><span class="o">-></span><span class="n">setBaseOutputURI</span><span class="p">(</span><span class="n">baseURI</span><span class="p">.</span><span class="n">c_str</span><span class="p">());</span>
</code></pre>
<p>a stylesheet then creates an output file <code>output.xml</code> relative to the baseURI e.g. it creates <code>file:///home/mh/libsaxon-EEC-linux-v12.2/samples/output.xml</code> but the code checks with</p>
<pre><code class="cpp syntaxhl" data-language="cpp"> <span class="n">cout</span><span class="o"><<</span> <span class="s">"exampleTransformToString = "</span><span class="o"><<</span><span class="n">result</span><span class="o"><<</span><span class="n">endl</span><span class="p">;</span>
<span class="n">string</span> <span class="n">filename</span> <span class="o">=</span> <span class="n">baseURI</span><span class="o">+</span><span class="s">"/output.xml"</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="n">CppTestUtils</span><span class="o">::</span><span class="n">exists</span><span class="p">(</span><span class="n">filename</span><span class="p">.</span><span class="n">c_str</span><span class="p">()))</span> <span class="p">{</span>
<span class="n">cout</span> <span class="o"><<</span> <span class="s">"The file output.xml exists"</span> <span class="o"><<</span> <span class="n">endl</span><span class="p">;</span>
<span class="n">remove</span><span class="p">(</span><span class="s">"output.xml"</span><span class="p">);</span>
<span class="n">sresult</span><span class="o">-></span><span class="n">success</span><span class="o">++</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="n">cout</span> <span class="o"><<</span> <span class="s">"The file output.xml does not exist"</span> <span class="o"><<</span> <span class="n">endl</span><span class="p">;</span>
<span class="n">sresult</span><span class="o">-></span><span class="n">failure</span><span class="o">++</span><span class="p">;</span>
<span class="n">sresult</span><span class="o">-></span><span class="n">failureList</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="s">"exampleTransformToString"</span><span class="p">);</span>
<span class="p">}</span>
</code></pre>
<p>and finds the file <code>file:///home/mh/libsaxon-EEC-linux-v12.2/samples/cppTests/output.xml</code> doesn't exist and counts the test as failed.</p>
<p>Therefore I think the base output URI needs to be set to <code>string baseURI = string("file://")+sproc->getcwd() + "/";</code>, if that test is supposed to pass.</p> SaxonC - Bug #6000 (New): net.sf.saxon.trans.LicenseException: Failed to read license file /usr/l...https://saxonica.plan.io/issues/60002023-04-27T13:16:44ZO'Neil Delprattoneil@saxonica.com
<p>Given the follow python script:</p>
<pre><code class="python syntaxhl" data-language="python"><span class="n">proc</span> <span class="o">=</span> <span class="n">PySaxonProcessor</span><span class="p">(</span><span class="n">license</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">proc</span><span class="p">.</span><span class="n">set_configuration_property</span><span class="p">(</span><span class="s">"http://saxon.sf.net/feature/licenseFileLocation"</span><span class="p">,</span> <span class="s">"/usr/lib/saxon-license.lic"</span><span class="p">)</span>
<span class="n">xsltproc</span> <span class="o">=</span> <span class="n">proc</span><span class="p">.</span><span class="n">new_xslt30_processor</span><span class="p">()</span>
</code></pre>
<p>If the license file is not fould using the @set_configuration property@ it will crash as follows:</p>
<pre><code>net.sf.saxon.trans.LicenseException: Failed to read license file /usr/lib/saxon-license.lic
at com.saxonica.config.Verifier.loadLicense(Verifier.java:130)
at com.saxonica.config.ProfessionalConfiguration.setConfigurationProperty(ProfessionalConfiguration.java:230)
at net.sf.saxon.s9api.Processor.setConfigurationProperty(Processor.java:402)
at net.sf.saxon.option.cpp.SaxonCAPI.applyToConfiguration(SaxonCAPI.java:569)
</code></pre>
<p>The problem is the @applyToConfiguration@ method in the class SaxonCAPI does not have graalvm exception handling annotation. We also need to add code in the C++ API to thrown the exception as a @SaxonApiException@</p> SaxonC - Bug #5943 (AwaitingInfo): XSLT through SaxonC PHP gives "Segmentation fault"https://saxonica.plan.io/issues/59432023-03-28T14:12:39ZYouri Lefers
<p>Hi all,</p>
<p>We've upgraded our SaxonC PHP library to Saxon 12(.1), but it gives a segmentation fault (error code 139 with PHPUnit) when it runs 2 or more transformations after each other. This happens in version 12.1, but also happened in version 12. We use PHP 8.1 (FPM).</p>
<p>We use a factory to construct and destruct a <code>SaxonProcessor</code> instance:</p>
<pre><code class="php syntaxhl" data-language="php"><span class="kn">use</span> <span class="nc">Saxon\SaxonProcessor</span><span class="p">;</span>
<span class="kd">class</span> <span class="nc">SaxonProcessorFactory</span>
<span class="p">{</span>
<span class="k">private</span> <span class="kt">?SaxonProcessor</span> <span class="nv">$saxonProcessor</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
<span class="k">public</span> <span class="k">function</span> <span class="n">__destruct</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="kc">null</span> <span class="o">!==</span> <span class="nv">$this</span><span class="o">-></span><span class="n">saxonProcessor</span><span class="p">)</span> <span class="p">{</span>
<span class="nv">$this</span><span class="o">-></span><span class="n">saxonProcessor</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">public</span> <span class="k">function</span> <span class="n">get</span><span class="p">():</span> <span class="kt">SaxonProcessor</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="kc">null</span> <span class="o">===</span> <span class="nv">$this</span><span class="o">-></span><span class="n">saxonProcessor</span><span class="p">)</span> <span class="p">{</span>
<span class="nv">$this</span><span class="o">-></span><span class="n">saxonProcessor</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-></span><span class="nf">create</span><span class="p">();</span>
<span class="p">}</span>
<span class="k">return</span> <span class="nv">$this</span><span class="o">-></span><span class="n">saxonProcessor</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">private</span> <span class="k">function</span> <span class="n">create</span><span class="p">():</span> <span class="kt">SaxonProcessor</span>
<span class="p">{</span>
<span class="nv">$saxonProcessor</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">SaxonProcessor</span><span class="p">();</span>
<span class="nv">$saxonProcessor</span><span class="o">-></span><span class="nf">setConfigurationProperty</span><span class="p">(</span><span class="s1">'http://saxon.sf.net/feature/recognize-uri-query-parameters'</span><span class="p">,</span> <span class="s1">'true'</span><span class="p">);</span>
<span class="k">return</span> <span class="nv">$saxonProcessor</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre>
<p>Then we use that processor to do XSLT transformations:</p>
<pre><code class="php syntaxhl" data-language="php"><span class="nv">$saxonProcessor</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-></span><span class="n">saxonProcessorFactory</span><span class="o">-></span><span class="nf">get</span><span class="p">();</span>
<span class="nv">$transformer</span> <span class="o">=</span> <span class="nv">$saxonProcessor</span><span class="o">-></span><span class="nf">newXslt30Processor</span><span class="p">();</span>
<span class="k">foreach</span> <span class="p">(</span><span class="nv">$parameters</span> <span class="k">as</span> <span class="nv">$key</span> <span class="o">=></span> <span class="nv">$value</span><span class="p">)</span> <span class="p">{</span>
<span class="nv">$transformer</span><span class="o">-></span><span class="nf">setParameter</span><span class="p">(</span><span class="nv">$key</span><span class="p">,</span> <span class="nv">$saxonProcessor</span><span class="o">-></span><span class="nf">createAtomicValue</span><span class="p">(</span><span class="nv">$value</span><span class="p">));</span>
<span class="p">}</span>
<span class="nv">$transformer</span><span class="o">-></span><span class="nf">transformFileToFile</span><span class="p">(</span><span class="nv">$tmpFilePath</span><span class="p">,</span> <span class="nv">$xsltFilePath</span><span class="p">,</span> <span class="nv">$outputFile</span><span class="o">-></span><span class="nf">getPath</span><span class="p">());</span>
<span class="k">if</span> <span class="p">(</span><span class="nv">$transformer</span><span class="o">-></span><span class="nf">exceptionOccurred</span><span class="p">())</span> <span class="p">{</span>
<span class="nv">$exception</span> <span class="o">=</span> <span class="nc">SaxonXsltTransformException</span><span class="o">::</span><span class="nf">forXslTransformation</span><span class="p">(</span><span class="nv">$transformer</span><span class="p">,</span> <span class="nv">$tmpFilePath</span><span class="p">,</span> <span class="nv">$xsltFilePath</span><span class="p">);</span>
<span class="nv">$transformer</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
<span class="k">throw</span> <span class="nv">$exception</span><span class="p">;</span>
<span class="p">}</span>
<span class="nv">$transformer</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</code></pre>
<p>The first time it runs fine (through for example unit tests), but the second time it gives a segmentation fault. I'm unable to debug this into a specific line or something that created the segmentation fault.</p>
<p>Are you guys able to help us out?</p> SaxonC - Bug #5871 (New): Correct pylint warningshttps://saxonica.plan.io/issues/58712023-02-05T08:06:14ZNorm Tovey-Walsh
<p>If you run <code>pylint</code> against a script that uses our wheels, you'll get warnings like this:</p>
<pre><code>module.py:7:0: E0611: No name 'PySaxonProcessor' in module 'saxonche' (no-name-in-module)
</code></pre>
<p>These warnings also appear in IDEs that do linting and I presume the lack of declarations "in the module" means that IDEs have no way to offer completions.</p>
<p>I assume this could be fixed by putting something in, probably, a <code>__init__.py</code> file, but I don't know what.</p> SaxonC - Bug #5860 (New): Self built python extension failure to link libraryhttps://saxonica.plan.io/issues/58602023-01-26T18:03:31ZO'Neil Delprattoneil@saxonica.com
<p>Reported by userL <a href="https://saxonica.plan.io/boards/4/topics/9261" class="external">https://saxonica.plan.io/boards/4/topics/9261</a></p>
<p>There is a problem to self build the python library from the pypi directory.</p>
<p>Currently if we build the wheel with the command:</p>
<pre><code>python3 setup.py bdist_wheel
</code></pre>
<p>or building the extension locallly:</p>
<pre><code>python3 setup.py build_ext -if
</code></pre>
<p>It builds successfully (although user reported that they had to make changes in the setup file to locate the library).
When we run a sample python script we get the following error:</p>
<pre><code>Traceback (most recent call last):
File "/Users/ond1/work/saxondev/build/temp/libsaxon-EEC-mac-x86_64-v12.0/pypi/samples/saxon_example.py", line 1, in <module>
import saxoncee
ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/saxoncee.cpython-39-darwin.so, 0x0002): symbol not found in flat namespace (_addProcessorDataPair)
</code></pre> SaxonC - Bug #5821 (New): Feature request: allow xml_file for parse_xml, etc.https://saxonica.plan.io/issues/58212023-01-16T10:05:03ZNorm Tovey-Walsh
<p>The <code>click</code> Python library allows me to declare that the input parameter or argument is an existing file. When I do, what I get as an argument is the opened file. It would be nice to be able to pass that directly to <code>parse_xml</code>, etc.</p>