@@ -366,16 +366,52 @@ WHERE
366366 <xsl : param name =" resource-types" select =" if (ancestor::div[@class = 'controls']//input[@class = 'forClass']/@value) then ancestor::div[@class = 'controls']//input[@class = 'forClass']/@value else ancestor::label//input[@class = 'forClass']/@value" as =" xs:anyURI*" />
367367 <xsl : param name =" select-string" select =" $select-labelled-string" as =" xs:string?" />
368368 <xsl : param name =" limit" select =" 100" as =" xs:integer?" />
369+ <xsl : param name =" label-var-name" select =" 'label'" as =" xs:string" />
370+ <xsl : param name =" type-var-name" select =" 'Type'" as =" xs:string" />
369371 <xsl : variable name =" key-code" select =" ixsl:get(ixsl:event(), 'code')" as =" xs:string" />
370- <!-- convert resource type URIs to SPARQLBuilder URIs -->
371- <xsl : variable name =" value-uris" select =" array { for $uri in $resource-types[not(. = '&rdfs; Resource')] return ixsl:call(ixsl:get(ixsl:get(ixsl:window(), 'SPARQLBuilder'), 'QueryBuilder'), 'uri', [ $uri ]) }" />
372372 <xsl : variable name =" select-builder" select =" ixsl:call(ixsl:get(ixsl:get(ixsl:window(), 'SPARQLBuilder'), 'SelectBuilder'), 'fromString', [ $select-string ])" />
373- <!-- pseudo JS code: SPARQLBuilder.SelectBuilder.fromString(select-builder).wherePattern(SPARQLBuilder.QueryBuilder.filter(SPARQLBuilder.QueryBuilder.regex(QueryBuilder.var("label"), QueryBuilder.term($value)))) -->
374- <xsl : variable name =" select-builder" select =" ixsl:call($select-builder, 'wherePattern', [ ixsl:call(ixsl:get(ixsl:get(ixsl:window(), 'SPARQLBuilder'), 'QueryBuilder'), 'filter', [ ixsl:call(ixsl:get(ixsl:get(ixsl:window(), 'SPARQLBuilder'), 'QueryBuilder'), 'regex', [ ixsl:call(ixsl:get(ixsl:get(ixsl:window(), 'SPARQLBuilder'), 'QueryBuilder'), 'str', [ ixsl:call(ixsl:get(ixsl:get(ixsl:window(), 'SPARQLBuilder'), 'QueryBuilder'), 'var', [ 'label' ]) ]), ixsl:call(ixsl:get(ixsl:get(ixsl:window(), 'SPARQLBuilder'), 'QueryBuilder'), 'term', [ ac:escape-regex(ixsl:get(., 'value')) ]), true() ]) ]) ])" />
375- <!-- pseudo JS code: SPARQLBuilder.SelectBuilder.fromString(select-builder).wherePattern(SPARQLBuilder.QueryBuilder.filter(SPARQLBuilder.QueryBuilder.in(QueryBuilder.var("Type"), [ $value ]))) -->
376- <xsl : variable name =" select-builder" select =" if (empty($resource-types[not(. = '&rdfs; Resource')])) then $select-builder else ixsl:call($select-builder, 'wherePattern', [ ixsl:call(ixsl:get(ixsl:get(ixsl:window(), 'SPARQLBuilder'), 'QueryBuilder'), 'filter', [ ixsl:call(ixsl:get(ixsl:get(ixsl:window(), 'SPARQLBuilder'), 'QueryBuilder'), 'in', [ ixsl:call(ixsl:get(ixsl:get(ixsl:window(), 'SPARQLBuilder'), 'QueryBuilder'), 'var', [ 'Type' ]), $value-uris ]) ]) ])" />
377- <xsl : variable name =" select-string" select =" ixsl:call($select-builder, 'toString', [])" as =" xs:string?" />
378- <xsl : variable name =" query-string" select =" ac:build-describe($select-string, $limit, (), (), true())" as =" xs:string?" />
373+ <xsl : variable name =" select-json-string" select =" ixsl:call(ixsl:get(ixsl:window(), 'JSON'), 'stringify', [ ixsl:call($select-builder, 'build', []) ])" as =" xs:string" />
374+ <xsl : variable name =" select-xml" select =" json-to-xml($select-json-string)" as =" document-node()" />
375+ <!-- append FILTER(regex()) -->
376+ <xsl : variable name =" select-xml" as =" document-node()" >
377+ <xsl : document >
378+ <xsl : apply-templates select =" $select-xml" mode =" ldh:add-regex-filter" >
379+ <xsl : with-param name =" var-name" select =" $var-name" tunnel =" yes" />
380+ <xsl : with-param name =" pattern" select =" $text" tunnel =" yes" />
381+ <xsl : with-param name =" flags" select =" 'iq'" tunnel =" yes" /> <!-- case insensitive, ignore meta-characters: https://www.w3.org/TR/xpath-functions-31/#flags -->
382+ </xsl : apply-templates >
383+ </xsl : document >
384+ </xsl : variable >
385+ <!-- append FILTER($var IN ()) -->
386+ <xsl : variable name =" select-xml" as =" document-node()" >
387+ <xsl : document >
388+ <xsl : choose >
389+ <!-- do not FILTER by $resource-types if the only type is rdfs:Resource -->
390+ <xsl : when test =" empty($resource-types[not(. = '&rdfs; Resource')])" >
391+ <xsl : sequence select =" $select-xml" />
392+ </xsl : when >
393+ <xsl : otherwise >
394+ <xsl : apply-templates select =" $select-xml" mode =" ldh:add-filter-in" >
395+ <xsl : with-param name =" var-name" select =" $var-name" tunnel =" yes" />
396+ <xsl : with-param name =" values" select =" $resource-types" tunnel =" yes" />
397+ </xsl : apply-templates >
398+ </xsl : otherwise >
399+ </xsl : choose >
400+ </xsl : document >
401+ </xsl : variable >
402+ <!-- set LIMIT -->
403+ <xsl : variable name =" select-xml" as =" document-node()" >
404+ <xsl : document >
405+ <xsl : apply-templates select =" $select-xml" mode =" ldh:replace-limit" />
406+ </xsl : document >
407+ </xsl : variable >
408+ <!-- wrap SELECT into a DESCRIBE -->
409+ <xsl : variable name =" query-xml" as =" element()" >
410+ <xsl : apply-templates select =" $select-xml" mode =" ldh:wrap-describe" />
411+ </xsl : variable >
412+ <xsl : variable name =" query-json-string" select =" xml-to-json($query-xml)" as =" xs:string" />
413+ <xsl : variable name =" query-json" select =" ixsl:call(ixsl:get(ixsl:window(), 'JSON'), 'parse', [ $query-json-string ])" />
414+ <xsl : variable name =" query-string" select =" ixsl:call(ixsl:call(ixsl:get(ixsl:get(ixsl:window(), 'SPARQLBuilder'), 'SelectBuilder'), 'fromQuery', [ $query-json ]), 'toString', [])" as =" xs:string" />
379415 <xsl : variable name =" results-uri" select =" ac:build-uri($endpoint, map{ 'query': string($query-string) })" as =" xs:anyURI" />
380416 <xsl : variable name =" request-uri" select =" ldh:href($ldt:base, ldh:absolute-path(ldh:href()), map{}, $results-uri)" as =" xs:anyURI" /> <!-- proxy the results -->
381417 <!-- TO-DO: use <ixsl:schedule-action> instead of document() -->
0 commit comments