XQuery交换机测试节点

XQuery交换机测试节点,xquery,xquery-3.0,Xquery,Xquery 3.0,在XQuery 3.1中,此(测试)查询通过检查name(),检查是否存在某些节点: 正确返回以下XML: <surplus reason="surplus">die</surplus> <surplus reason="repeated">et Raimundum de las de Recaut</surplus> 我在case上测试节点的方式是否有问题,它在同一文档中没有发现tei:result 注意:当我对包含第一个case(tei:si

在XQuery 3.1中,此(测试)查询通过检查
name()
,检查是否存在某些节点:

正确返回以下XML

<surplus reason="surplus">die</surplus>
<surplus reason="repeated">et Raimundum de las de Recaut</surplus>
我在
case
上测试节点的方式是否有问题,它在同一文档中没有发现
tei:result

注意:当我对包含第一个case(
tei:sic
)的文档执行相同操作时,它的输出很好。显然,原则上的测试应该有效


提前感谢。

开关结构比较原子值。您可以这样使用它:

switch (node-name($n))
case QName("http://tei-namespace/", "sic") return <something/>

结果表明,XQuery
switch
将操作数表达式原子化。在这种情况下,节点被简化为一个名称。因此,需要在每个
案例中测试某种类型的字符串。由于这个原因,第二个开关将无法返回结果,因为我正在测试原子化结果不可预测的节点。请参阅XQuery 3.1中的如何检查节点。
declare variable $doc := 
  doc("/db/apps/deheresi/data/ms609_0013.xml"));

let $ele := $doc//tei:sic | $doc//tei:surplus

for $n in $ele 

let $output := switch ($n)
            case ($n/self::tei:sic)
                return (<span class="inter">
                        <i>ms. </i>
                        {$n/tei:orig/text()}
                        </span>,
                        <span class="diplo">
                        <i>corr. </i>
                        {$n/tei:corr/text()}
                        </span>)
            case ($n/self::tei:surplus[@reason="surplus"])
                return (<span><i>supp.</i>{$n/text()}</span>)
            case ($n/self::tei:surplus[@reason="repeated"])
                return (<span><i>supp. (dup.)</i>{$n/text()}</span>)
            default return  ""
 return $output
switch (node-name($n))
case QName("http://tei-namespace/", "sic") return <something/>
typeswitch ($n)
case element(tei:sic) return <something/>