本文介绍了XPTY0004 预期项目,找到序列,如何使用 Xquery 查找序列中是否存在值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嗨..我想确定一个值是否存在于序列中,例如,如果我有一个如下所示的 XML

<内容><客户SC=25"item=200"><号码id=250"><字符值=PRE"评估=1"></客户><客户SC=25"项目=200"><号码id=780"><字符值=EMB"评估=1"></客户><客户SC=25"item=240"><号码id=666"值=123"><字符值=EMB"></客户><客户SC=25"item=280"><号码id=1994";值=1234"><字符值=POST"></客户><客户SC=25"item=300"><号码id=19956"值=1235"><字符值=PRE"></客户></内容></模块>

请在下面找到xquery

 for $p in doc("abc.xml")//module/content让 $csns := $p/catalouge在 $csns 中的 $csn让 $item := $csn/string(@item)让 $isns := $csn/Number对于 $isn 在 $isns让 $id := $isn/string(@id)让 $count := $isn/Character/data(count)让 $count_status := contains($count, '1994')返回 $count_status

我正在尝试检查计数标记是否具有返回布尔值的值 1994(FOR A/C 1994、1995、1996、1997、0357、0376)在运行 Xquery 时,我尝试使用 contains 函数但徒劳无功,当我在 Xquery 上方运行时出现错误

错误:[XPTY0004] 预期项目,找到的序列:(FOR A/C 1994、1995、1996、1997、0357、0376",...).

但我需要返回一个布尔值

解决方案

请尝试以下 XQuery.我在 BaseX 9.4.6 中测试过

XQuery

xquery 版本3.1";将变量 $year 声明为 xs:string :='1994';声明上下文项 := 文档 {<模块><内容><目录SC=25"item=200"><号码id=250"RefIds=xyz20000"><字符condValue=PRE"changeMark=1"></目录><目录SC=25"item=200"><号码id=780"RefIds=xyz20000"><字符condValue=EMB"changeMark=1"></目录><目录SC=25"item=240"><号码id=666"值=123"RefIds=xyz20000"><字符condValue=EMB"></目录><目录SC=25"item=280"><号码id=1994";值=1234"RefIds=xyz20000"><字符 condValue=POST"></目录><目录SC=25"item=300"><号码id=19956"值=1235"RefIds=xyz20000"><字符condValue=PRE"></目录></内容></模块>};{对于 ./module/content/catalouge/Number/Character/count 中的 $xreturn <r status='{contains($x/text(), $year)}'>{data($x)}</r>}</root>

输出

<r状态=真">对于A/C 1994、1995、1996、1997、0357、0376</r><r状态=真">对于A/C 1995、1996、1994、1997、0357、0376</r><r状态=真">对于A/C 1998、1995、1996、1994、0357、0376</r><r status=true">对于 A/C 0357, 1995, 1996, 1997, 1994, 0376 </r><r状态=真">对于A/C 1995、1994、1996、1997、0357、0376</r><r状态=真">对于A/C 1994、1995、1909、1997、0357、0376</r><r状态=真">对于A/C 1997、1995、1996、1994、0357、0376</r></root>
<module>
<content>
<customer SC="25" item="200">
<Number id="250">
<Character Value="PRE" Evaluate="1">
<count Number="1" Name="Sree">FOR XYZ 1994, 1995, 1996, 1997, 0357, 0376</count>
</Character>
<Character Value="EMB">
<count Number="154" Name="Sree" Evaluate="1">FOR XYZ 1995, 1996, 1994, 1997, 0357, 0376</count>
</Character>
</Number>
</customer>
<customer SC="25" item="200" >
<Number id="780" >
<Character Value="EMB" Evaluate="1">
<count Number="1" Name="Sree">FOR XYZ 1998, 1995, 1996, 1994, 0357, 0376</count>
</Character>
<Character Value="EMB">
<count Number="154" Name="Sree" Evaluate="1">FOR XYZ 0357, 1995, 1996, 1997, 1994, 0376</count>
</Character>
</Number>
</customer>
<customer SC="25" item="240">
<Number id="666" Value="123" >
<Character Value="EMB">
<count Number="2" Name="Sree" Evaluate="1">FOR XYZ 1995, 1994, 1996, 1997, 0357, 0376</count>
</Character>
</Number>
</customer>
<customer SC="25" item="280">
<Number id="1994" Value="1234" >
<Character Value="POST">
<count Number="3" Name="Sree" Evaluate="1">FOR XYZ 1994, 1995, 1909, 1997, 0357, 0376</count>
</Character>
</Number>
</customer>
<customer SC="25" item="300">
<Number id="19956" Value="1235" >
<Character Value="PRE">
<count Number="4" Name="Sree" Evaluate="1">FOR XYZ 1997, 1995, 1996, 1994, 0357, 0376</count>
</Character>
</Number>
</customer>
</content>
</module>
    for  $p in doc("abc.xml")//module/content
    let $csns := $p/catalouge
        for $csn in $csns
            let $item := $csn/string(@item)
            let $isns := $csn/Number
            for $isn in $isns
              let $id := $isn/string(@id)
      let $count :=  $isn/Character/data(count)
      let $count_status := contains($count, '1994')
return $count_status

Error:[XPTY0004] Item expected, sequence found: ("FOR A/C 1994, 1995, 1996, 1997, 0357, 0376", ...).

But I need to return a boolean value

解决方案

Please try the following XQuery. I tested it in BaseX 9.4.6

XQuery

xquery version "3.1";

declare variable $year as xs:string :='1994';

declare context item := document {
<module>
    <content>
        <catalouge SC="25" item="200">
            <Number id="250" RefIds="xyz20000">
                <Character condValue="PRE" changeMark="1">
                    <count Number="1" Name="Sree">FOR A/C 1994, 1995, 1996, 1997, 0357, 0376</count>
                </Character>
                <Character condValue="EMB">
                    <count Number="154" Name="Sree" changeMark="1">FOR A/C 1995, 1996, 1994, 1997, 0357, 0376</count>
                </Character>
            </Number>
        </catalouge>
        <catalouge SC="25" item="200">
            <Number id="780" RefIds="xyz20000">
                <Character condValue="EMB" changeMark="1">
                    <count Number="1" Name="Sree">FOR A/C 1998, 1995, 1996, 1994, 0357, 0376</count>
                </Character>
                <Character condValue="EMB">
                    <count Number="154" Name="Sree" changeMark="1">FOR A/C 0357, 1995, 1996, 1997, 1994, 0376</count>
                </Character>
            </Number>
        </catalouge>
        <catalouge SC="25" item="240">
            <Number id="666" Value="123" RefIds="xyz20000">
                <Character condValue="EMB">
                    <count Number="2" Name="Sree" changeMark="1">FOR A/C 1995, 1994, 1996, 1997, 0357, 0376</count>
                </Character>
            </Number>
        </catalouge>
        <catalouge SC="25" item="280">
            <Number id="1994" Value="1234" RefIds="xyz20000">
                <Character condValue="POST">
                    <count Number="3" Name="Sree" changeMark="1">FOR A/C 1994, 1995, 1909, 1997, 0357, 0376</count>
                </Character>
            </Number>
        </catalouge>
        <catalouge SC="25" item="300">
            <Number id="19956" Value="1235" RefIds="xyz20000">
                <Character condValue="PRE">
                    <count Number="4" Name="Sree" changeMark="1">FOR A/C 1997, 1995, 1996, 1994, 0357, 0376</count>
                </Character>
            </Number>
        </catalouge>
    </content>
</module>
};

<root>
{
  for $x in ./module/content/catalouge/Number/Character/count
  return <r status='{contains($x/text(), $year)}'>{data($x)}</r>
}
</root>

Output

<root>
  <r status="true">FOR A/C 1994, 1995, 1996, 1997, 0357, 0376</r>
  <r status="true">FOR A/C 1995, 1996, 1994, 1997, 0357, 0376</r>
  <r status="true">FOR A/C 1998, 1995, 1996, 1994, 0357, 0376</r>
  <r status="true">FOR A/C 0357, 1995, 1996, 1997, 1994, 0376</r>
  <r status="true">FOR A/C 1995, 1994, 1996, 1997, 0357, 0376</r>
  <r status="true">FOR A/C 1994, 1995, 1909, 1997, 0357, 0376</r>
  <r status="true">FOR A/C 1997, 1995, 1996, 1994, 0357, 0376</r>
</root>

这篇关于XPTY0004 预期项目,找到序列,如何使用 Xquery 查找序列中是否存在值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-22 20:38