为什么我的 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')
我有一个测试函数,它将文档作为参数并将其从 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')