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