【问题标题】:How return multiple tags inside a if/else using XQuery?如何使用 XQuery 在 if/else 中返回多个标签?
【发布时间】:2018-10-29 13:11:40
【问题描述】:

我必须这样做:

declare function xf:NameOfXQ($myIn as element(ns2:myIn))
    as element() {
        <ns0:tagIn>

            <myObj>
               {
                for $var in $myValueOfVar
                    return
                        if ($var= "X") then
                            <tagA>A</tagA>
                            <tagB>B</tagB>
                            <tagC>C</tagC>
                        else
                            <tagD>D</tagD>
                }
            </myObj>

        </ns0:tagIn>
};

但是当构建 xquery 时,我的项目说“无效的表达式,期待 ELSE,找到 '>'” 然后我尝试使用 4 个 IF,一个来填充每个标签,例如:

declare function xf:NameOfXQ($myIn as element(ns2:myIn))
    as element() {
        <ns0:tagIn>

            <myObj>
            {
            for $var in $myValueOfVar
                return
                    if ($var= "X") then
                        <tagA>A</tagA>
                    else
                        ()
                    if ($var= "X") then
                        <tagB>B</tagB>
                    else
                        ()
                    if ($var= "X") then
                        <tagC>C</tagC>
                    else
                        ()
                    if ($var != "X") then
                        <tagD>D</tagD>
                    else
                        ()
            }
            </myObj>

        </ns0:tagIn>
};

然后我的项目说“无效表达式:意外令牌:if” 我怎样才能正确地做到这一点?

【问题讨论】:

  • 一个 XML 片段必须有一个根标记才能被认为是有效的,这就是 XQuery 无法编译的原因。您也许可以改用一系列 XML 片段,例如(&lt;tagA&gt;A&lt;/tagA&gt;, &lt;tagB/&gt;, ...)
  • 你的意思是一个父亲标签,比如...?因为如果是这样的东西,我有,我只是忘了输入问题代码。如果是其他事情,你能解释一下吗?感谢您的帮助。
  • 是的父标签,但您的 FLWOR 表达式本身应该返回一个有效的 XML 片段。我正在为序列使用编写一个示例,我已经好几年没有编写 XQuery 了,所以我宁愿测试它。如果我成功了,我会发表评论。
  • 好的,返回一系列 XML 片段而不是单个 XML 片段有效;请参阅xpathtester.com/xquery/219e8413be6a63eefe68da2b5097cab5 获取示例
  • 简而言之,只需在多个 XML 标记周围添加括号并用逗号分隔它们

标签: xquery


【解决方案1】:

XQuery 不认为多个连续的标签在语法上是正确的,一个 XML 片段必须有一个根标签才有效。

但是,它允许您使用语法为 (item1, item2, ... itemN) 的序列类型,您可以使用它让 FLWOR 表达式的 return 子句产生多个 XML 标记:

for $var in $myValueOfVar
    return
        if ($var= "X") then
            (
                <tagA>A</tagA>,
                <tagB>B</tagB>,
                <tagC>C</tagC>
            )
        else
            <tagD>D</tagD>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-10
    • 2019-04-24
    • 2017-05-21
    • 2013-08-23
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 2020-08-20
    相关资源
    最近更新 更多