On Fri, 9 Jul 2021 at 13:01, Christian Grün <christian.gruen@gmail.com> wrote:
Hi all, hi Reece,
I have remastered the conversion of Java values: Objects of unknown type are now returned as function item, and the conversion of the contained value can be enforced by invoking the function item:
Thanks. I've ported my code over to the latest 9.6 dev release, which is working aside from a strange caching issue. The following produces the correct output in the BaseX GUI: --- declare namespace String = "java:java.lang.String"; declare function local:tokenize($text as xs:string) { String:split($text, " ") }; local:tokenize("Lorem ipsum dolor"), local:tokenize("sed emit consecutor") --- Note: I'm using `String:split($text, " ")` here as a demonstration of the issue. However, if I take my https://github.com/rhdunn/document-viewer code running on the BaseX HTTP server (via bin/basexhttp on AdoptOpenJDK 11.0.7+10), and in src/modules/html.xqy add: --- declare namespace String = "java:java.lang.String"; declare function local:tokenize($text as xs:string) { String:split($text, " ") }; --- and then modify the text() case in html:simplify from: --- if (contains($node, "margin-bottom: ")) then () else $node --- to --- if (contains($node, "margin-bottom: ")) then () else text { html:tokenize($node) } --- I just see whitespace (as if it is caching the first $node value). Changing it to: --- if (contains($node, "margin-bottom: ")) then () else if (normalize-space($node) eq "") then $node else text { html:tokenize($node) } --- then I see the first non-whitespace text node repeated. If I then replace the `String:split($text, " ")` call with `tokenize($text)` I don't see the issue, so it seems to be related with the Java interop being cached. Kind regards, Reece