为什么我的 XPath 断言测试在 eXist-db 中通过了?

Why my XPath assertion test does pass in eXist-db?

我有一个测试函数,它将文档作为参数并将其从 XML 转换为 HTML。为此,我想使用一些测试。 %test:assertXPath 在这种情况下似乎是个不错的选择。但是,如果我使用整个路径,我无法理解它的行为。

我的函数:

xquery version "3.0";

module namespace cust = 'http://46.28.111.241:8081/exist/db/apps/myapp/modules/cust';

declare namespace tei  = 'http://www.tei-c.org/ns/1.0';
declare namespace test = 'http://exist-db.org/xquery/xqsuite';
declare
    %test:args('<TEI xmlns="http://www.tei-c.org/ns/1.0">
                    <text>
                        <body>
                            <div n="1">
                                <head>Heading</head>
                                <p>paragraph</p>
                            </div>
                        </body>
                    </text>
                </TEI>',
                '/db/apps/myapp/resources/xslt/style-web.xsl')
    %test:assertXPath('$result//@*')
    %test:assertXPath('$result//*')
    %test:assertXPath('$result//*[@class = "chapter"]')
    %test:assertXPath('$result/html')
function cust:transform($doc as element(), $styleSheet as xs:anyURI) as node() {
    let $styleSheet := doc($styleSheet)
    let $document := 
        (
            <book n='1'>{($doc//tei:div[@n='1'])[1]}</book>
        )
    let $finale := transform:transform($document, $styleSheet, ())
    return $finale
};

结果:

<testsuites>
    <testsuite package="http://46.28.111.241:8081/exist/db/apps/myapp/modules/cust"
        timestamp="2016-03-17T09:14:40.107+01:00" failures="1" pending="0" tests="1" time="PT0.449S">
        <testcase name="transform" class="cust:transform">
            <failure message="assertXPath failed." type="failure-error-code-1">$result/html</failure>
            <output>
                <html xmlns="http://www.w3.org/1999/xhtml">
                    <head>
                        <title/>
                        <meta charset="UTF-8"/>
                    </head>
                    <body>
                        <div id="wrapper">
                            <section xmlns:epub="http://www.idpf.org/2007/ops" epub:type="chapter">
                                <h1 class="chapter">Heading</h1>
                                <p>paragraph</p>
                            </section>
                        </div>
                    </body>
                </html>
            </output>
        </testcase>
    </testsuite>
</testsuites>

显然唯一没有通过的断言是$result/html。为什么?

您的 XPath 断言中缺少命名空间。您正在生成的 <html> 元素位于 http://www.w3.org/1999/xhtml 命名空间中。

因此您需要将断言更改为:

%test:assertXPath('$result/*:html')

或者您需要使用 declare namespace xhtml = "http://www.w3.org/1999/xhtml"; 在序言中声明名称空间前缀,然后您的断言将如下所示:

%test:assertXPath('$result/xhtml:html')