XQuery:如何处理嵌套 FLWOR 语句中的多个 if-then-elses?

XQuery: How to deal with multiple if-then-elses in a nested FLWOR statement?

过去几周我一直在处理 XQuery,但在混合使用 XQuery 和 (X)HTML 代码时,我有时仍然对 XQuery 语法有异议。

由于我的 XML 文档中的结构更复杂,我有一个嵌套的 FLWOR 语句。在某些时候我需要插入一些 if-then-else 语句,但是根据它们在代码中的位置,它们要么根本不会造成任何问题,要么文件将不再被验证。

这是我的代码的简化版本:

xquery version "3.0";
declare option exist:serialize "method=xhtml media-type=text/html";
<html>
    <head>
        <meta HTTP-EQUIV="Content-Type" content="text/html; charset=UTF-8"/>
        <link rel="stylesheet" type="text/css" href="style.css"/>
        <title>{$page-title}</title>
    </head>
    <body>   
        {
        let some variables
        ...
        return
        for $text in $texts
        let some variables
        ...
        return
        <div id="text">
            <div id="title">{$title}</div>
            <div id="id">({data($id)})</div>
            {
            if ($headword/form = $searchphrase) then
            <div id="headword2">{$headword/form}</div>
            else
            <div id="headword1">{$headword/form}</div>
            }
            {
            for $variant in $variants
            return
            ***
            <div id="variant">{$variant/form}
            ***
                {
                for $variant_cit in $variant/citation
                return
                if ($variant_cit/form = $searchphrase) then
                <div id="variant_cit_2">{$variant_cit/form}</div>
                else
                <div id="variant_cit_1">{$variant_cit/form}</div>
                }
            </div>
            }
        </div>
        }  
    </body>
</html>

此代码按预期工作,但一旦我想替换

<div id="variant">{$variant/form}

(星号之间的线)

if ($variant/form = $searchphrase) then
    <div id="variant2">{$variant/form}
else
    <div id="variant1">{$variant/form}

无法再验证代码。添加另一对括号也无济于事。

也许我只是遗漏了一个微小的细节,但我没有看到。有人可以帮忙吗?

XQuery 是一种正交表达式语言,这意味着您可以替换任何表达式,例如

<div>{$variant/@form}</div>

用不同的表达方式,例如

if ($condition) then
  <div>{$variant/@form}</div>
else
  <span>{$variant/@form}</span>

但是您要替换的文本片段,即

<div id="variant">{$variant/form}

不是一个完整的表达式,所以你不能这样做(这种事情在某些宏语言中是可能的,例如 shell 脚本,其中条件适用于表达式文本中的任意字符序列.但是XQuery不是宏语言)。

在您的特定情况下,解决方案非常简单。而不是写

if ($variant/form = $searchphrase) then
    <div id="variant2">{$variant/form}
else
    <div id="variant1">{$variant/form}
...

您可以使用更简单(且有效)的方法

<div id="{if ($variant/form = $searchphrase) 
          then 'variant2' 
          else 'variant1'}">{$variant/form} ...