【问题标题】:XPTY0004 Item expected, sequence found, How to find whether a value is present in a sequence or not using XqueryXPTY0004 预期项目,找到序列,如何使用 Xquery 查找序列中是否存在值
【发布时间】:2021-02-09 02:34:44
【问题描述】:

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

<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>

请在下面找到 xquery

    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

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

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

但我需要返回一个布尔值

【问题讨论】:

    标签: xml xpath xquery basex


    【解决方案1】:

    请尝试以下 XQuery。我在 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>
    

    输出

    <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>
    

    【讨论】:

      猜你喜欢
      • 2016-08-23
      • 2017-07-12
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      • 2019-07-24
      • 2019-10-03
      • 2016-01-31
      • 2012-09-23
      相关资源
      最近更新 更多