Passing a value resulting from SaxonJS.XPath.evaluate as a parameter to fn:transform in further SaxonJS.XPath.evaluate as a typed parameter
Added by Martin Honnen about 2 years ago
Hi,
I need some help what could be wrong with my code. For the context, some users of my SaxonJS based XSLT 3 fiddle would like to have a separate dialog to provide any parameter values for global stylesheet parameters. And one idea is to allow to provide that value as an XPath expression to be evaluated.
The prototype I have written works as long as the parameter has no "as" declaring a type, but with a simple as="xs:string"
, the code fails with a seeminly contradicting error message Supplied value (string) foo does not match required type xs:string in stylesheet parameter Q{}p1
. Or perhaps that error message tells where I have gone wrong and I need help to tell me how to understand why the type is wrong and how to fix the code to pass in an XPath evaluated value from JS to SaxonJS XPath/XSLT:
A quick demo code (written for SaxonJS under Node, tested with SaxonJS 2.5) is
const SaxonJS = require('saxon-js');
const xslt1 = `<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
expand-text="yes">
<xsl:param name="p1" as="xs:string"/>
<xsl:template match="/" name="xsl:initial-template">
<parameter-test>$p1 is {$p1}</parameter-test>
<xsl:comment>Run with {system-property('xsl:product-name')} {system-property('xsl:product-version')} {system-property('Q{http://saxon.sf.net/}platform')}</xsl:comment>
</xsl:template>
</xsl:stylesheet>`;
const paramString1 = `"foo"`;
const xdmParamMap1 = new SaxonJS.XdmMap();
const qname = SaxonJS.XS.QName.fromEQName('Q{}p1');
const value = [SaxonJS.XPath.evaluate(paramString1)];
xdmParamMap1.inSituPut(qname, value);
const result = SaxonJS.XPath.evaluate(`
transform(map {
'stylesheet-text' : $xslt-text,
'delivery-format' : 'serialized',
'stylesheet-params' : $xslt-params
})?output
`,
[],
{ params : {
'xslt-text' : xslt1,
'xslt-params' : xdmParamMap1
}
}
);
console.log(result);
Complete error I get is
C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4578
null!==ha&&(oa=F.rb(ha,!0));R.collectionFinder=function(B){return"undefined"===typeof B?null:oa[B]};ha=!["raw","serialized"].includes(w);try{ja(S);"true"===S.relocatable&&(R.isRelocatableStylesheet=!0);if(R.stylesheetNode||R.packageText||R.packageNode)R.stylesheetInternal=S;var ba=A.checkOptions(R);A.internalTransform(S,da,ba);var ua=ba.principalResult}catch(B){if(B instanceof L&&B.Ze)throw new L(B.message,B.code.toString());throw B;}if(ua&&ha){ob.ca(Array.isArray(ua));da=Me(d);var Ga=Re.getComplexContentOutputter(da);
^
Error
at new L (C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4109:549)
at w (C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4604:117)
at C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4637:287
at C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4650:124
at C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4625:263
at C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4623:472
at C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4632:430
at Array.map (<anonymous>)
at C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4632:407
at Sa.g (C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4588:500)
at Va (C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:9:299)
at Wa.next (C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:10:91)
at zc.next (C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4217:288)
at string-join (C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4558:331)
at C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4632:444
at C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4389:408
at C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4358:33
at Array.forEach (<anonymous>)
at C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4358:6
at C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4380:97
at C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4358:33
at Array.forEach (<anonymous>)
at C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4358:6
at Object.push (C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4390:143)
at Object.e [as internalTransform] (C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4988:69)
at transform (C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4578:303)
at C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4632:444
at C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4646:463
at Object.I [as evaluate] (C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4600:203)
at Object.evaluate (C:\Users\marti\AppData\Roaming\npm\node_modules\saxon-js\SaxonJS2N.js:4936:362)
at Object.<anonymous> (C:\Users\marti\OneDrive\Documents\xslt\blog-xslt-3-by-example\saxonjs-param-types\paramTest2.js:28:30)
at Module._compile (node:internal/modules/cjs/loader:1126:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1180:10)
at Module.load (node:internal/modules/cjs/loader:1004:32)
at Function.Module._load (node:internal/modules/cjs/loader:839:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:17:47 {
message: 'Supplied value (string) foo does not match required type xs:string in stylesheet parameter Q{}p1',
name: 'XError',
code: 'XPTY0004',
xsltLineNr: '9',
xsltModule: 'NoStylesheetBaseURI'
}
Replies (2)
RE: Passing a value resulting from SaxonJS.XPath.evaluate as a parameter to fn:transform in further SaxonJS.XPath.evaluate as a typed parameter - Added by Martin Honnen about 2 years ago
I think I have found a fix, using const value = SaxonJS.XPath.evaluate(paramString1, null, { resultForm: 'xdm' });
seems to fix it. Sigh, too many options on possible results to get it first on the first five attempts, but I guess that happens with a powerful and flexible API.
RE: Passing a value resulting from SaxonJS.XPath.evaluate as a parameter to fn:transform in further SaxonJS.XPath.evaluate as a typed parameter - Added by Michael Kay about 2 years ago
My guess would be that it's confusion between a Javascript string and an XDM string, but I'll leave the SaxonJS team to look at it more closely.
Please register to reply