Узел тестирования коммутатора XQuery - PullRequest
0 голосов
/ 23 октября 2018

В XQuery 3.1 этот (тестовый) запрос проверяет наличие определенных узлов, проверяя name():

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/name())
            case ("sic")
                return ($n)
            case ("surplus")
                return ($n)
            default return ""
return $output

Возвращает следующий XML правильно :

<surplus reason="surplus">die</surplus>
<surplus reason="repeated">et Raimundum de las de Recaut</surplus>

Теперь, когда я хочу снова выполнить свой фактический запрос в том же документе, чтобы проверить узел для создания HTML, он не находит тот же tei:surplus:

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

Что-то не так с тем, как я тестирую узел на case, что он не находит tei:surplus в том же документе?

NB: когда я делаю то же самое дляДокумент, который содержит первый случай (tei:sic), он выводит нормально.Очевидно, что тест в принципе должен работать!

Заранее спасибо.

1 Ответ

0 голосов
/ 24 октября 2018

Конструкция переключателя сравнивает атомные значения.Вы можете использовать его следующим образом:

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

Обратите внимание на использование node-name() вместо name(), чтобы избежать какой-либо зависимости от префиксов пространства имен.

Но, вероятно, лучше использовать typeswitch:

typeswitch ($n)
case element(tei:sic) return <something/>
...