From: Joe W. <jo...@gm...> - 2023-03-14 17:00:52
|
Hi Bernie, I've just had a look at the XQSuite source where %assertXPath annotations are processed ( https://github.com/eXist-db/exist/blob/develop/exist-core/src/main/resources/org/exist/xquery/lib/xqsuite/xqsuite.xql#L944-L992). It appears to me that XQSuite dynamically constructs namespace declarations based on the in-scope namespaces in the return value of the function. So if your function's return value contained an HTML element with namespace prefix bindings, like: <html:html xmlns:html="http://www.w3.org/1999/xhtml"> ... XQSuite would dynamically create the following namespace declaration: declare namespace xhtml='http://www.w3.org/1999/xhtml'; ... which would be prepended to your %assertXPath annotation and evaluated. Since your function's return value doesn't associate <html> with any namespace prefix - only a namespace URI - then you should construct your %assertXPath annotations with the expectation that elements have a default namespace of "http://www.w3.org/1999/xhtml". Thus I would suggest that you try modifying your %assertXPath annotations to be: %test:assertXPath("$result//html") %test:assertXPath("$result//html/head[title = 'Bad Request']") %test:assertXPath("$result/html/body/p[@class = 'ErrorMessage']") I haven't tested this myself, so if you give this a try, could you let us know the result? If we confirm that my hunch is correct, then we could supply some additional hints in the documentation for this annotation at https://exist-db.org/exist/apps/doc/xqsuite#annotations. Thanks! Joe On Tue, Mar 14, 2023 at 8:52 AM Harris, Bernard T. (GSFC-5870) via Exist-open <exi...@li...> wrote: > No matter what I do, I cannot get a useful (more than "$result") > %:assertXPath to work in this case > > xquery version "3.1"; > > import module namespace inspect="http://exist-db.org/xquery/inspection"; > import module namespace test="http://exist-db.org/xquery/xqsuite" > at "resource:org/exist/xquery/lib/xqsuite/xqsuite.xql"; > > declare namespace xhtml = "http://www.w3.org/1999/xhtml"; > > declare > %test:arg("error", "Bad Request") > %test:arg("description", "Invalid ResourceID") > %test:arg("extraHtml") > %test:assertXPath("$result//*:html") > (: > %test:assertXPath("$result//*:html/*:head[*:title = 'Bad > Request']") > %test:assertXPath("$result/xhtml:html/xhtml:body/xhtml:p[@class = > 'ErrorMessage']") > :) > function local:errorHtml( > $error as xs:string, > $description as xs:string, > $extraHtml as node()?) > as node() > { > let $result := > <html xmlns="http://www.w3.org/1999/xhtml" lang="en" > xml:lang="en"> > <head> > <title>{$error}</title> > </head> > <body> > <p class='ErrorMessage'><b>Message: </b>{$error}</p> > <p class='ErrorDescription'><b>Description: > </b>{$description}</p> > {$extraHtml} > </body> > </html> > return > $result > }; > > let $f := local:errorHtml#3 > return > test:suite($f) > > > It always results in > > <testsuites> > <testsuite package="http://www.w3.org/2005/xquery-local-functions" > timestamp="2023-03-14T08:28:16.065-04:00" tests="1" failures="1" errors="0" > pending="0" time="PT0.002S"> > <testcase name="errorHtml" class="local:errorHtml"> > <failure message="assertXPath failed." > type="failure-error-code-1">$result//*:html</failure> > <output> > <html xmlns="http://www.w3.org/1999/xhtml" lang="en" > xml:lang="en"> > <head> > <title>Bad Request</title> > </head> > <body> > <p class="ErrorMessage"> > <b>Message: </b>Bad Request</p> > <p class="ErrorDescription"> > <b>Description: </b>Invalid ResourceID</p> > </body> > </html> > </output> > </testcase> > </testsuite> > </testsuites> > > Or > > <testcase name="errorHtml" class="spasexq:errorHtml"> > <error type="err:XPST0081" message="It is a static error if a > QName used in an expression contains a namespace prefix that cannot be > expanded into a namespace URI by using the statically known namespaces. > Error while evaluating expression: $result//xhtml:html. No namespace > defined for prefix xhtml:html"/> > </testcase> > > If I use the xhtml namespace in the assertXPath annotation. I found > someone report a similar problem on stackoverflow in 2016 but it is not > clear to me how it was resolved. This is on exist-db 6.2.0 and Java 11. > Does anyone know what I am doing wrong? Thanks. > > Bernie Harris > > > > > _______________________________________________ > Exist-open mailing list > Exi...@li... > https://lists.sourceforge.net/lists/listinfo/exist-open > |