标签: flwor

Xquery:无论是在switch/case还是if/then/else中使用,相同的测试都有不同的结果

我无法找到以下解释.我已经制作了这个测试脚本以解决我之前的问题.

xquery version "3.0" ;
declare default function namespace 'local' ;

declare function local:is-img-only( $element as element() )  as xs:boolean {    
   ($element/child::*[1] instance of element(img)) 
   and (fn:not($element/child::*[2])) 
   and (fn:normalize-space($element) = '')
} ;

let $in-xml := <myxml>
   <p id="1">

      <img id="1"/>

   </p>
   <p id="2">
      <img id="1"/>
      hello
   </p>
   <p id="3">
      <img id="1"/>
   </p>
   <p id="4">
    <blockquote>hello</blockquote>
      <img id="1"/>
   </p>
   <p id="5">
      <img id="1"/>
      <img id="2"/>
   </p>
</myxml>
Run Code Online (Sandbox Code Playgroud)

然后,使用以下内容if then else:

for $p in $in-xml/p
  return if …
Run Code Online (Sandbox Code Playgroud)

xquery if-statement case switch-statement flwor

6
推荐指数
1
解决办法
183
查看次数

使用xquery FLWOR表达式查找多个"where"限制

我正在努力找到在休斯顿工作的员工,但项目所在的部门并不在休斯顿.我试图在FLWOR表达式的这个示例之后对表达式进行建模,但是查询没有返回任何内容,它应该返回结果.

编辑:这是输入.

xquery
let $doc := doc("~path/company.xml")
for $e in $doc//employee,
    $d in $doc//department,
    $p in $doc//projects
where $d/locations[location!="Houston"]
and $p/project[plocations="Houston"]
return <e>{$e/fname}{$e/lname}{$e/address}</e>
/
Run Code Online (Sandbox Code Playgroud)

xml xpath xquery xpath-2.0 flwor

5
推荐指数
1
解决办法
6424
查看次数

从XML FLWOR查询返回计算的元素名称

我在SQLServer 2008 R2中有以下XML数据

DECLARE @data XML
SET @data = '<root attr1="val1" attr2="val2" attr3="val3"/>'
Run Code Online (Sandbox Code Playgroud)

我想从root获取属性名称列表,并将其作为元素列表输出,如下所示:

<root>
  <attr1>val1</attr1>
  <attr2>val2</attr2>
  <attr3>val3</attr3>
</root>
Run Code Online (Sandbox Code Playgroud)

我一直在玩FLWOR查询以获得我想要的东西.到目前为止我有这个:

SELECT @data.query('
for $attr in /*/@*
return <test>{fn:string($attr)}</test>
')
Run Code Online (Sandbox Code Playgroud)

这很好,几乎是我需要的,但当我尝试这样做时......

SELECT @data.query('
for $attr in /*/@*
return <{fn:local-name($attr)}>{fn:string($attr)}</{fn:local-name($attr)}>
')
Run Code Online (Sandbox Code Playgroud)

它不开心.除了硬编码元素名称之外,它似乎不喜欢任何其他东西.

如何返回具有计算名称的元素?

xml sql-server xquery flwor

4
推荐指数
1
解决办法
1022
查看次数

Sql server中的FLWOR计数命中数

我正在使用SQL Server 2008 R2.我的问题是我想要计算使用FLWOR从XQuery查询收到的点击次数.对于每次点击,我想要一个连续的数字,如:0,1,2,3,4 ......

我的查询:

select @xml.query('for $s at $count in /Root/Persons/Person
return <Person ID="{$count}">{$s}</Person>')
Run Code Online (Sandbox Code Playgroud)

这里唯一的问题是SQL Server不支持这个问题,我收到一个错误:

Msg 9335, Level 16, State 1, Line 16
XQuery [query()]: The XQuery syntax 'at' is not supported.
Run Code Online (Sandbox Code Playgroud)

我也尝试过let关键字并定义新变量,但我不知道如何在每次迭代时增加该变量的值?

感谢所有答案,弗伦基

xquery sql-server-2008-r2 xquery-sql flwor

4
推荐指数
1
解决办法
1186
查看次数

为什么group by $ variable/@属性不起作用?

问题背景

鉴于每个家庭的类别......

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <family>
        <categories>
            <cat id="1" />
            <cat id="2" />
        </categories>
    </family>
    <family>
        <categories>
            <cat id="3" />
            <cat id="5" />
        </categories>
    </family>
    <family>
        <categories>
            <cat id="3" />
            <cat id="5" />
            <cat id="6" />
        </categories>
    </family>
</root>
Run Code Online (Sandbox Code Playgroud)

我想要家庭最常见的类别......

<common-family-category id="3" count="2"/>
<common-family-category id="5" count="2"/>
Run Code Online (Sandbox Code Playgroud)

成功的尝试

我可以通过对每个迭代的id进行分组来实现该结果...

for $family-category-id in //family/categories/cat/@id
count $return-indexes
group by $family-category-id
order by count($return-indexes) descending
where count($return-indexes) > 1
return
<common-family-category id="{$family-category-id}" count="{count($return-indexes)}" />
Run Code Online (Sandbox Code Playgroud)

并且通过迭代每个类别并将id存储在变量中......

for $family-category in //family/categories/cat
let $family-category-id := $family-category/@id …
Run Code Online (Sandbox Code Playgroud)

xml xquery flwor basex xquery-3.0

2
推荐指数
1
解决办法
118
查看次数

XQuery:以 FLWOR 方式填充数组

我有一个数组,我想用取自特定 XML 节点的字符串填充它,就像在这个伪代码示例中一样:

let $array := array {}

for $child in $collection
where contains(data($child), "Hey")
do $array := array:append($array, data($child))
Run Code Online (Sandbox Code Playgroud)

正确的代码如何执行这样的操作?

所以如果我有这个 XML

<root>
    <child>Hey</child>
    <child>Ho</child>
    <child>Hey Ho</child>
</root>
Run Code Online (Sandbox Code Playgroud)

我希望数组是

array ["Hey", "Hey Ho"]
Run Code Online (Sandbox Code Playgroud)

xquery flwor basex

2
推荐指数
1
解决办法
920
查看次数