Saxonica Developer Community: Issueshttps://saxonica.plan.io/https://saxonica.plan.io/favicon.ico2024-03-22T14:42:37ZSaxonica Developer Community
Planio Saxon - Support #6376 (In Progress): Xslt Map Memory Footprinthttps://saxonica.plan.io/issues/63762024-03-22T14:42:37Zfouad MOUTASSIM
<p>Hello,</p>
<p>We are using Saxonica 10.4 with Java and have noticed that it consumes a lot of memory when running.
For example, when processing a payload of 100MB, the map consumes 1.3GB, which causes memory issues in our application.</p>
<p>We kindly request your support in addressing this matter.</p>
<p>Please find attached the following elements:</p>
<p>The XSLT map.
The Java class.
The input payload.
Thank you in advance for your support.</p> Saxon - Bug #6361 (In Progress): XPath parser continously looping to find Xpath function library ...https://saxonica.plan.io/issues/63612024-02-27T09:32:05ZManikandan S
<ul>
<li>I am trying to load a custom library of XPath functions in my project using a custom build jar. However when the function is called to load the XPath functions i get redirected to XPathParser.java class which is present in the package net.sf.saxon.expr.parser, where a function is called - reportMissingFunction which consist of the following loop and it never exits this loop even though it could not find the a particular XPath function.</li>
<li>Jar file is located in classpath under JVM_PARAMS, Xpath function is able to find that jar from classPath.</li>
</ul>
<pre><code class="java syntaxhl" data-language="java"> <span class="k">if</span> <span class="o">(</span><span class="n">config</span><span class="o">.</span><span class="na">getBooleanProperty</span><span class="o">(</span><span class="nc">Feature</span><span class="o">.</span><span class="na">ALLOW_EXTERNAL_FUNCTIONS</span><span class="o">))</span> <span class="o">{</span>
<span class="kt">boolean</span> <span class="n">existsWithDifferentArity</span> <span class="o">=</span> <span class="kc">false</span><span class="o">;</span>
<span class="k">for</span><span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">arguments</span><span class="o">.</span><span class="na">length</span> <span class="o">+</span> <span class="mi">5</span><span class="o">;</span> <span class="o">++</span><span class="n">i</span><span class="o">)</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">i</span> <span class="o">!=</span> <span class="n">arguments</span><span class="o">.</span><span class="na">length</span><span class="o">)</span> <span class="o">{</span>
<span class="nc">SymbolicName</span><span class="o">.</span><span class="na">F</span> <span class="n">sn</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">SymbolicName</span><span class="o">.</span><span class="na">F</span><span class="o">(</span><span class="n">functionName</span><span class="o">,</span> <span class="n">i</span><span class="o">);</span>
<span class="k">if</span> <span class="o">(</span><span class="k">this</span><span class="o">.</span><span class="na">env</span><span class="o">.</span><span class="na">getFunctionLibrary</span><span class="o">().</span><span class="na">isAvailable</span><span class="o">(</span><span class="n">sn</span><span class="o">))</span> <span class="o">{</span>
<span class="n">existsWithDifferentArity</span> <span class="o">=</span> <span class="kc">true</span><span class="o">;</span>
<span class="k">break</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="k">if</span> <span class="o">(</span><span class="n">existsWithDifferentArity</span><span class="o">)</span> <span class="o">{</span>
<span class="n">sb</span><span class="o">.</span><span class="na">append</span><span class="o">(</span><span class="s">". The namespace URI and local name are recognized, but the number of arguments is wrong"</span><span class="o">);</span>
<span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
<span class="n">supplementary</span> <span class="o">=</span> <span class="n">getMissingFunctionExplanation</span><span class="o">(</span><span class="n">functionName</span><span class="o">,</span> <span class="n">config</span><span class="o">);</span>
<span class="k">if</span> <span class="o">(</span><span class="n">supplementary</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
<span class="n">sb</span><span class="o">.</span><span class="na">append</span><span class="o">(</span><span class="s">". "</span><span class="o">).</span><span class="na">append</span><span class="o">(</span><span class="n">supplementary</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
<span class="n">sb</span><span class="o">.</span><span class="na">append</span><span class="o">(</span><span class="s">". External function calls have been disabled"</span><span class="o">);</span>
<span class="o">}</span>
</code></pre>
<ul>
<li>I do not understand whats going on and my application freezes since it is always stuck in the for-loop.</li>
<li>I am expecting either the function to be found and exit the for-loop and continue the normal behavior of my application or some timeout to be set or an error message to be thrown if the XPath functions are not found in that loop.</li>
<li>Please let me know your suggestion on how to proceed.</li>
<li>I'm using Saxon 10.6 and Xpath 3.0</li>
</ul>
<p><strong>Note:</strong> Here I'm using custom library(External Jar file) which inside the class path contains some Xpath functions, not modified anything on Saxon FunctionLibrary interface.</p>
<p><strong>Stack overflow ticket :</strong> <a href="https://stackoverflow.com/questions/78001210/xpath-parser-continously-looping-to-find-xpath-function-library-in-a-given-custo?noredirect=1#comment137514388_78001210" class="external">https://stackoverflow.com/questions/78001210/xpath-parser-continously-looping-to-find-xpath-function-library-in-a-given-custo?noredirect=1#comment137514388_78001210</a></p> SaxonJS - Feature #6330 (New): XSD Schema Validation in SaxonJS https://saxonica.plan.io/issues/63302024-01-26T13:30:29ZEric Van Boxsom
<p>it would be amazing to have a XSD Schema Validation feature in SaxonJS.</p>
<p>Do you think it is something you could be working on anytime soon ?</p>
<p>Thank you</p> Saxon - Bug #6305 (New): XPathException "The stylesheet module includes/imports itself directly o...https://saxonica.plan.io/issues/63052023-12-22T15:02:48ZGerben Abbinkgerben.abbink@gmail.com
<p>I use an ErrorReporter with XsltCompiler, like this:</p>
<pre><code>XsltCompiler compiler = processor.newXsltCompiler();
compiler.setErrorReporter(...);
</code></pre>
<p>Usually, XPathExceptions have a Location to identify the error in the file.</p>
<p>But, when I use this template, there is no location information:</p>
<pre><code><?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href=""/>
</xsl:stylesheet>
</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 - Feature #6287 (New): User extension function for the C++, PHP and Python APIshttps://saxonica.plan.io/issues/62872023-12-15T10:09:44ZO'Neil Delprattoneil@saxonica.com
<p>SaxonC 12 currently does not support user extension functions written in the languages C++, PHP and Python.</p>
<p>We used to support this feature in SaxonC 11, but since we have moved from using Excelsior Jet to Graalvm as the underlying JVM engine it is no longer straightforward to reuse the JNI mechanism to do the callbacks for the extension functions.</p>
<p>Following a user request on stackoverflow (i.e. <a href="https://stackoverflow.com/questions/77641333/use-external-user-python-functions-in-a-xml-or-xslt-by-using-saxonc-12-4-for-pyt" class="external">https://stackoverflow.com/questions/77641333/use-external-user-python-functions-in-a-xml-or-xslt-by-using-saxonc-12-4-for-pyt</a>), I am adding this issue as a feature request for SaxonC 12.</p>
<p>On the Graalvm slack I have been advised that we can call C/C++ method from Java code in native using CFunction.</p>
<p>Also to consider that "C++ method is hard, you need a C proxy that calls desired method".</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> Saxon - Bug #6042 (AwaitingInfo): Xerces occasionally throws ArrayIndexOutOfBoundsExceptionhttps://saxonica.plan.io/issues/60422023-05-21T17:29:54ZNorm Tovey-Walsh
<p>Can't reproduce this locally and debugging through the narrow opening provided by CI is awfully painful, but FYI:</p>
<p>This is <code>xspec.bat</code> (slightly hacked) from the DocBook xslTNG project running on Windows CI in GitHub. I've instrumented the batch file with:</p>
<pre><code> echo "XSLT:"
echo %*
</code></pre>
<p>The full command is:</p>
<pre><code> java ^
-Dfile.encoding=UTF-8 ^
-Dxspec.coverage.ignore="%TEST_DIR%" ^
-Dxspec.coverage.xml="%COVERAGE_XML%" ^
-Dxspec.home="%XSPEC_HOME%" ^
-Dxspec.xspecfile="%XSPEC%" ^
-Dorg.docbook.xsltng.extensions.pygmentize="%PYGMENTIZE%" ^
-Dorg.docbook.xsltng.verbose="%VERBOSE%" ^
-cp "%CP%" net.sf.saxon.Transform %CATALOG% ^
-init:org.docbook.xsltng.extensions.Register %*
</code></pre>
<p>With Saxon 11.5:</p>
<pre><code>Formatting Report...
"XSLT:"
-o:"D:\a\xslTNG\xslTNG\build\default-result.html" -s:"D:\a\xslTNG\xslTNG\build\default-result.xml" -xsl:"D:\a\xslTNG\xslTNG\build\xspec-2.2.4\bin\..\src\reporter\format-xspec-report.xsl" inline-css=true
java.lang.IllegalStateException: java.lang.ArrayIndexOutOfBoundsException: 2048
at net.sf.saxon.resource.ActiveSAXSource.deliver(ActiveSAXSource.java:233)
at net.sf.saxon.resource.ActiveStreamSource.deliver(ActiveStreamSource.java:65)
at net.sf.saxon.event.Sender.send(Sender.java:105)
at net.sf.saxon.Configuration.buildDocumentTree(Configuration.java:4138)
at net.sf.saxon.s9api.DocumentBuilder.build(DocumentBuilder.java:334)
at net.sf.saxon.Transform.processFile(Transform.java:1346)
at net.sf.saxon.Transform.doTransform(Transform.java:871)
at net.sf.saxon.Transform.main(Transform.java:81)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 2048
at org.apache.xerces.impl.io.UTF8Reader.read(Unknown Source)
at org.apache.xerces.impl.XMLEntityScanner.load(Unknown Source)
at org.apache.xerces.impl.XMLEntityScanner.scanContent(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanContent(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at net.sf.saxon.resource.ActiveSAXSource.deliver(ActiveSAXSource.java:190)
... 7 more
Fatal error during transformation: java.lang.IllegalStateException: java.lang.ArrayIndexOutOfBoundsException: 2048
*** Error formatting the report
</code></pre>
<p>with Saxon 12.2:</p>
<pre><code>Formatting Report...
"XSLT:"
-o:"D:\a\xslTNG\xslTNG\build\default-result.html" -s:"D:\a\xslTNG\xslTNG\build\default-result.xml" -xsl:"D:\a\xslTNG\xslTNG\build\xspec-2.2.4\bin\..\src\reporter\format-xspec-report.xsl" inline-css=true
java.lang.ArrayIndexOutOfBoundsException: 2048
at org.apache.xerces.impl.io.UTF8Reader.read(Unknown Source)
at org.apache.xerces.impl.XMLEntityScanner.load(Unknown Source)
at org.apache.xerces.impl.XMLEntityScanner.scanContent(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanContent(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at net.sf.saxon.resource.ActiveSAXSource.deliver(ActiveSAXSource.java:190)
at net.sf.saxon.resource.ActiveStreamSource.deliver(ActiveStreamSource.java:65)
at net.sf.saxon.event.Sender.send(Sender.java:104)
at net.sf.saxon.Configuration.buildDocumentTree(Configuration.java:4210)
at net.sf.saxon.s9api.DocumentBuilder.build(DocumentBuilder.java:334)
at net.sf.saxon.Transform.processFile(Transform.java:1345)
at net.sf.saxon.Transform.doTransform(Transform.java:879)
at net.sf.saxon.Transform.main(Transform.java:83)
Fatal error during transformation: java.lang.ArrayIndexOutOfBoundsException: 2048
*** Error formatting the report
</code></pre>
<p>It's particularly annoying that this looks like an encoding issue but I have explicitly specified the <code>file.encoding</code> and the same code on my local Windows machine does not fail.</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> SaxonJS - Bug #5916 (New): Using xsl:merge with xsl:merge-source for-each-source="'input1.xml'" s...https://saxonica.plan.io/issues/59162023-03-12T12:40:08ZMartin Honnenmartin.honnen@gmx.de
<p>I have tried to run an XSLT 3 example using XSLT 3's new xsl:merge through SaxonJS 2.5's <code>xslt3</code> command line tool under Windows 11 with Node 16, a simple example using e.g.</p>
<pre><code class="xml syntaxhl" data-language="xml"> <span class="nt"><xsl:template</span> <span class="na">name=</span><span class="s">"xsl:initial-template"</span><span class="nt">></span>
<span class="nt"><list></span>
<span class="nt"><xsl:merge></span>
<span class="nt"><xsl:merge-source</span> <span class="na">name=</span><span class="s">"master"</span> <span class="na">for-each-source=</span><span class="s">"'input1.xml'"</span> <span class="na">sort-before-merge=</span><span class="s">"yes"</span> <span class="na">select=</span><span class="s">"/list/item"</span><span class="nt">></span>
<span class="nt"><xsl:merge-key</span> <span class="na">select=</span><span class="s">"@id"</span> <span class="na">order=</span><span class="s">"ascending"</span><span class="nt">/></span>
<span class="nt"></xsl:merge-source></span>
</code></pre>
<p>gives an error</p>
<pre><code>Transformation failure: Error XPDY0002 at sheet1.xsl#7
Focus for / is absent
Error XPDY0002 at sheet1.xsl#7
Focus for / is absent
</code></pre>
<p>The code runs fine through Saxon HE 11.5 Java.</p>
<p>Full files attached; command line <code>xslt3 -t -it -xsl:sheet1.xsl</code> gives output</p>
<pre><code>SaxonJS 2.5 from Saxonica
Node.js version v16.17.1
Compiling stylesheet C:\Users\marti\OneDrive\Documents\xslt\blog-xslt-3-by-example\nested-merge\sheet1.xsl
Stylesheet compilation time: 0.342s
Initial template: Q{http://www.w3.org/1999/XSL/Transform}initial-template
Asynchronous transform with options: stylesheetText={"N":"package","version":"30",(string), stylesheetBaseURI=file://C:/Users/marti/OneDrive(string), stylesheetParams=[object Object](string), outputProperties=[object Object](string), extraOptions=[object Object](string), destination=stdout(string), baseOutputURI=file://C:/Users/marti/OneDrive(string), logLevel=2(string), initialTemplate=Q{http://www.w3.org/1999/XSL/T(string),
SEF generated by SaxonJS 2.5 at 2023-03-12T13:32:13.485+01:00
Transformation failure: Error XPDY0002 at sheet1.xsl#7
Focus for / is absent
Error XPDY0002 at sheet1.xsl#7
Focus for / is absent
</code></pre> Saxon - Feature #5755 (New): Wouldn't it be nice to have an Package Resolver?https://saxonica.plan.io/issues/57552022-12-06T12:23:45ZNico Kutscherauer
<p>The general idea:</p>
<p>Saxon should have a new configuration option where the user can provide a Java class implementing a specific interface. The class should work similar to the <code>URIResolver</code>, just for packages. It receives a package name and a requested version info like it was specified in the <code><xsl:use-package></code> and returns the <code>javax.xml.transform.Source</code> of the package file or <code>null</code> if the package is not available. Any time Saxon compiles a stylesheet containing an <code><xsl:use-package></code> declaration it asks at first the Pakage Resolver for the resource. If it returns <code>null</code> it uses the current logic to get it.</p>
<p>What is the benefit?</p>
<ul>
<li>You could implement a repository based pull mechanism for XSLT packages .In my mind, it's something like Maven already does with its dependency concept. Companies could maintain internal repositories or even an "XSLT central" could be come real.</li>
<li>You could make lookups for packages based on common patterns. For instance I developed an <a href="https://github.com/nkutsche/xslt-package-handler" class="external">XSLT Package Handler</a> which works with the generic initializer option and collects all packages which can be found in the classpath. This would be much more elegant, if it would not use the very generic intializer interface and if it would have a pull mechanism.</li>
</ul>
<p>What do you think?</p> SaxonJS - Bug #5656 (New): XDM array is not converted to a true JS array?https://saxonica.plan.io/issues/56562022-08-22T22:47:45ZMartynas Jusevicius
<p>According to <a href="https://www.saxonica.com/saxon-js/documentation2/index.html#!xdm/conversions" class="external">XDM to JavaScript Conversion</a> <code>array(*)</code> should be converted to a JS array.</p>
<p>However this code:</p>
<pre><code><xsl:variable name="array" select="[ 'a' ]" as="array(*)"/>
<xsl:sequence select="ixsl:call($array, 'push', [ 'b' ])"/>
</code></pre>
<p>gives error:</p>
<pre><code>ixsl:call: object method 'push' not found
</code></pre>
<p>Same error for this code (note that <code>@as</code> is absent here):</p>
<pre><code><xsl:variable name="array" select="js:Array([ 'a' ])"/>
<xsl:sequence select="ixsl:call($array, 'push', [ 'b' ])"/>
</code></pre> SaxonJS - Support #5225 (New): While using xslt 3.0 function "xml-to-json" would like to avoid es...https://saxonica.plan.io/issues/52252022-01-24T10:51:15ZJuhi Gupta
<p>We are trying to convert xml to json, while using function "xml-to-json" it is trying to escape '/' by adding '' before it. We would like to avoid doing that and translate as is.</p>
<pre><code class="xml syntaxhl" data-language="xml">
<span class="cp"><?xml version="1.0" encoding="UTF-8"?></span>
<span class="nt"><xsl:stylesheet</span> <span class="na">xmlns:xsl=</span><span class="s">"http://www.w3.org/1999/XSL/Transform"</span>
<span class="na">xmlns=</span><span class="s">"http://www.w3.org/2005/xpath-functions"</span>
<span class="na">xmlns:func=</span><span class="s">"http://ingka.ikea.com/"</span>
<span class="na">xmlns:xs=</span><span class="s">"http://www.w3.org/2001/XMLSchema"</span>
<span class="na">version=</span><span class="s">"3.0"</span><span class="nt">></span>
<span class="nt"><xsl:output</span> <span class="na">method=</span><span class="s">"text"</span><span class="nt">/></span>
<span class="nt"><xsl:template</span> <span class="na">match=</span><span class="s">"/"</span><span class="nt">></span>
<span class="nt"><xsl:variable</span> <span class="na">name=</span><span class="s">"transformed-xml"</span><span class="nt">></span>
<span class="nt"><xsl:call-template</span> <span class="na">name=</span><span class="s">"SamplBody"</span> <span class="nt">/></span>
<span class="nt"><xsl:copy-of</span> <span class="na">select=</span><span class="s">"/map"</span><span class="nt">/></span>
<span class="nt"></xsl:variable></span>
<span class="nt"><xsl:value-of</span> <span class="na">select=</span><span class="s">"xml-to-json($transformed-xml, map { 'indent' : true() })"</span><span class="nt">/></span>
<span class="nt"></xsl:template></span>
<span class="nt"><xsl:template</span> <span class="na">name=</span><span class="s">"SamplBody"</span> <span class="nt">></span>
<span class="nt"><map></span>
<span class="nt"><string</span> <span class="na">key=</span><span class="s">"SamplString"</span><span class="nt">></span>n/a<span class="nt"></string></span>
<span class="nt"></map></span>
<span class="nt"></xsl:template></span>
<span class="nt"></xsl:stylesheet></span>
</code></pre>
<p>and the result of this xslt is</p>
<pre><code class="json syntaxhl" data-language="json"><span class="w">
</span><span class="p">{</span><span class="w"> </span><span class="nl">"SamplString"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="s2">"n</span><span class="se">\/</span><span class="s2">a"</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></code></pre>
<p>We would like the result to look like</p>
<pre><code class="json syntaxhl" data-language="json"><span class="w">
</span><span class="p">{</span><span class="w"> </span><span class="nl">"SamplString"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="s2">"n/a"</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></code></pre>
<p>Can you suggest a solution for this?</p> Saxon - Bug #4664 (In Progress): Xerces bug: Wrong value of xml:base attribute after resolving XI...https://saxonica.plan.io/issues/46642020-08-03T10:48:44ZO'Neil Delprattoneil@saxonica.com
<p>The following Xerces bug is affecting several users: <a href="https://issues.apache.org/jira/browse/XERCESJ-1102" class="external">https://issues.apache.org/jira/browse/XERCESJ-1102</a></p>
<p>This bug causes the wrong value of xml:base attribute after resolving XInclude references. One user applies a the patch in a jar file that is included on the Java classpath when Saxon is invoked. It would be good to apply this patch internally with Saxon as part of the issued product.</p>
<p>This affects: Saxon-J, Saxon.NET and Saxon/C</p> SaxonC - Bug #4312 (New): XDM_NODE_KIND enumeration type not available in PHPhttps://saxonica.plan.io/issues/43122019-09-13T10:08:25ZO'Neil Delprattoneil@saxonica.com
<p>It would be good to have XDM_NODE_KIND enumeration type available in the Saxon/C PHP extension.</p>
<p>This would be similar to what we have in the C++ API.</p>