我正在尝试清理一些 XQuery 代码并遇到另一个问题(最后一个问题是这个问题:Error "undefined variable at noteLine" in FLWOR expression when return multiple nodes)。我正在进一步清理以下工作代码,以尽量减少重用:
for $noteLine in $noteLineArr
where $noteLine != ''
return (
<NTE>
<NoteRefCd>BOL</NoteRefCd>
<Descr>{fn:substring(fn:normalize-space($noteLine), 1, 80)}</Descr>
</NTE>,
if (fn:string-length(fn:normalize-space($noteLine)) > 80 and fn:string-length(fn:normalize-space($noteLine)) <= 160) then (
<NTE>
<NoteRefCd>BOL</NoteRefCd>
<Descr>{fn:substring(fn:normalize-space($noteLine), 81, 80)}</Descr>
</NTE>
) else if (fn:string-length(fn:normalize-space($noteLine)) > 160) then (
<NTE>
<NoteRefCd>BOL</NoteRefCd>
<Descr>{fn:substring(fn:normalize-space($noteLine), 81, 80)}</Descr>
</NTE>,
<NTE>
<NoteRefCd>BOL</NoteRefCd>
<Descr>{fn:substring(fn:normalize-space($noteLine), 161, 80)}</Descr>
</NTE>
) else ()
)
现在我将第一个 NTE 移出,我想对其余的基本上做同样的事情(运行一个 IF,只使用所需的代码输出另一个)所以我描绘了一个这样的解决方案:
for $noteLine in $noteLineArr
where $noteLine != ''
return (
<NTE>
<NoteRefCd>BOL</NoteRefCd>
<Descr>{fn:substring(fn:normalize-space($noteLine), 1, 80)}</Descr>
</NTE>,
if (fn:string-length(fn:normalize-space($noteLine)) > 80) then (
<NTE>
<NoteRefCd>BOL</NoteRefCd>
<Descr>{fn:substring(fn:normalize-space($noteLine), 81, 80)}</Descr>
</NTE>
) else()
if (fn:string-length(fn:normalize-space($noteLine)) > 160) then (
<NTE>
<NoteRefCd>BOL</NoteRefCd>
<Descr>{fn:substring(fn:normalize-space($noteLine), 161, 80)}</Descr>
</NTE>
) else ()
)
这在解析器中失败,错误“Unexpected Token: ' (fn:string-len...'”指向第二个 if 语句。我的结论是 XQuery 不喜欢重复 if 部分,除非它们在一个节点内,比如这:
for $noteLine in $noteLineArr
where $noteLine != ''
return (
<NTE>
<NoteRefCd>BOL</NoteRefCd>
<Descr>{fn:substring(fn:normalize-space($noteLine), 1, 80)}</Descr>
</NTE>,
<NTE>
if (fn:string-length(fn:normalize-space($noteLine)) > 80) then (
<NoteRefCd>BOL</NoteRefCd>,
<Descr>{fn:substring(fn:normalize-space($noteLine), 81, 80)}</Descr>
) else()
</NTE>,
<NTE>
if (fn:string-length(fn:normalize-space($noteLine)) > 160) then (
<NoteRefCd>BOL</NoteRefCd>,
<Descr>{fn:substring(fn:normalize-space($noteLine), 161, 80)}</Descr>
) else ()
</NTE>
)
这是行不通的,因为如果这些额外的节点为空,我不能让任何额外的节点进入输出。XQuery 中有没有办法以类似的方式实现所需的输出(我通过将一些代码放入本地函数中找到了解决方案,但它不像 imo 那样可读)?并且可能作为后续,为什么 XQuery 对多个连续的 if 语句如此敏感?
解决方案(再次感谢 Jens Erat)
for $noteLine in $noteLineArr
where $noteLine != ''
return (
<NTE>
<NoteRefCd>BOL</NoteRefCd>
<Descr>{fn:substring(fn:normalize-space($noteLine), 1, 80)}</Descr>
</NTE>,
if (fn:string-length(fn:normalize-space($noteLine)) > 80) then (
<NTE>
<NoteRefCd>BOL</NoteRefCd>
<Descr>{fn:substring(fn:normalize-space($noteLine), 81, 80)}</Descr>
</NTE>
) else(),
if (fn:string-length(fn:normalize-space($noteLine)) > 160) then (
<NTE>
<NoteRefCd>BOL</NoteRefCd>
<Descr>{fn:substring(fn:normalize-space($noteLine), 161, 80)}</Descr>
</NTE>
) else()
)
(注意:逗号放置在返回的前两个“部分”之后,第一个 NTE 节点和 if 语句之后,而不是在 if 语句中)。