首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回多个节点时FLWOR表达式中的“noteLine未定义变量”错误

返回多个节点时FLWOR表达式中的“noteLine未定义变量”错误
EN

Stack Overflow用户
提问于 2016-01-21 21:56:15
回答 1查看 290关注 0票数 2

我有一个非常奇怪的问题,一个FLWOR循环,它的工作方式,但不是另一个方式。其目标是获取任意长度的字符串,并将其分解为每个只能容纳80个字符的XML节点。所以,首先,这是很棒的:

代码语言:javascript
复制
    for $noteLine in $noteLineArr
    where $noteLine != ''

    return
    if (fn:string-length(fn:normalize-space($noteLine)) < 80) then (
    <NTE>
        <NoteRefCd>WHI</NoteRefCd>
        <Descr>{fn:substring(fn:normalize-space($noteLine), 1, 80)}</Descr>
    </NTE>  
    ) else if (fn:string-length(fn:normalize-space($noteLine)) > 80 and fn:string-length(fn:normalize-space($noteLine)) <= 160) then (
    <NTE>
        <NoteRefCd>WHI</NoteRefCd>
        <Descr>{fn:substring(fn:normalize-space($noteLine), 1, 80)}</Descr>
    </NTE>,
    <NTE>
        <NoteRefCd>WHI</NoteRefCd>
        <Descr>{fn:substring(fn:normalize-space($noteLine), 81, 80)}</Descr>
    </NTE>
    ) else if (fn:string-length(fn:normalize-space($noteLine)) > 160 and fn:string-length(fn:normalize-space($noteLine)) <= 240) then (
    <NTE>
        <NoteRefCd>WHI</NoteRefCd>
        <Descr>{fn:substring(fn:normalize-space($noteLine), 1, 80)}</Descr>
    </NTE>,
    <NTE>
        <NoteRefCd>WHI</NoteRefCd>
        <Descr>{fn:substring(fn:normalize-space($noteLine), 81, 80)}</Descr>
    </NTE>,
    <NTE>
        <NoteRefCd>WHI</NoteRefCd>
        <Descr>{fn:substring(fn:normalize-space($noteLine), 161, 80)}</Descr>
    </NTE>
    ) else()            

所以,我在脑海中明白这并不是很优雅。我试图通过将第一个元素从if中移出来清理它,因为它应该总是被使用的,对吗?这么少的代码?以下是我尝试过的:

代码语言:javascript
复制
for $noteLine in $noteLineArr
where $noteLine != ''

return

    <NTE>
        <NoteRefCd>WHI</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>WHI</NoteRefCd>
        <Descr>{fn:substring(fn:normalize-space($noteLine), 81, 80)}</Descr>
    </NTE>
    ) else if (fn:string-length(fn:normalize-space($noteLine)) > 160 and fn:string-length(fn:normalize-space($noteLine)) <= 240) then (
    <NTE>
        <NoteRefCd>WHI</NoteRefCd>
        <Descr>{fn:substring(fn:normalize-space($noteLine), 81, 80)}</Descr>
    </NTE>,
    <NTE>
        <NoteRefCd>WHI</NoteRefCd>
        <Descr>{fn:substring(fn:normalize-space($noteLine), 161, 80)}</Descr>
    </NTE>
    ) else()    

解析器现在告诉我“noteLine上的未定义变量”指向第一个"if“行。我在这里错过了什么?(请注意,是的,对于如何更好地清理这个问题,我确实有其他的想法,但这是第一个简单的步骤,当它不幸地失败时,我惊慌失措)。

解决方案(感谢Jens )需要将返回块包装在括号中,以便强制它在flwor循环的每一次迭代中充分评估。因此:

代码语言:javascript
复制
for $noteLine in $noteLineArr
where $noteLine != ''

return
    (
        <NTE>
            <NoteRefCd>WHI</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>WHI</NoteRefCd>
            <Descr>{fn:substring(fn:normalize-space($noteLine), 81, 80)}</Descr>
        </NTE>
        ) else if (fn:string-length(fn:normalize-space($noteLine)) > 160 and fn:string-length(fn:normalize-space($noteLine)) <= 240) then (
        <NTE>
            <NoteRefCd>WHI</NoteRefCd>
            <Descr>{fn:substring(fn:normalize-space($noteLine), 81, 80)}</Descr>
        </NTE>,
        <NTE>
            <NoteRefCd>WHI</NoteRefCd>
            <Descr>{fn:substring(fn:normalize-space($noteLine), 161, 80)}</Descr>
        </NTE>
        ) else()
    )
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-21 22:50:21

这是一个小的语法问题。您必须在return子句中创建的元素周围加上括号。为了进一步解释这个问题,我提供了一个类似但简化的示例:

代码语言:javascript
复制
for $i in 1 to 3
return
    <foo />,
    <bar />

您希望得到以下结果(这两个元素重复了三次):

代码语言:javascript
复制
<foo/>
<bar/>
<foo/>
<bar/>
<foo/>
<bar/>

但是相反,你得到了

代码语言:javascript
复制
<foo/>
<foo/>
<foo/>
<bar/>

这是因为查询实际上被计算为

代码语言:javascript
复制
(
  for $i in 1 to 3
  return
      <foo />
),
<bar />

在您的代码中,您不会得到意外的输出,而是一条错误消息。这是因为$noteLine不是在第一个逗号,之后定义的。对于以下查询,您将得到类似的错误消息:

代码语言:javascript
复制
for $i in 1 to 3
return
    <foo>{ $i }</foo>,
    <bar>{ $i }</foo>

在这里,$i不绑定到<bar/>元素,因为查询被计算为

代码语言:javascript
复制
(
  for $i in 1 to 3
  return
      <foo>{ $i }</foo>
),
<bar>{ $i }</foo> (: obivously, $i is not defined here :)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34935080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档