0

在过去几周处理过 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}

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

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

4

1 回答 1

2

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} ...
于 2015-05-28T19:21:28.167 回答