xquery-使用条件联接

xquery-使用条件联接,xquery,Xquery,我正在尝试从一个链接编号列表中构建html表行,查询在线xml文件中是否存在相应的发布编号,如果可用,还将添加额外的同级元素信息 这是联机xml文件: imlit.xml列表文件如下所示: <litigation> [...] <h2>Affiliated Transactions/Joint Transactions</h2> <ul> <li><a href="/litigation/admin/2014/

我正在尝试从一个链接编号列表中构建html表行,查询在线xml文件中是否存在相应的发布编号,如果可用,还将添加额外的同级元素信息

这是联机xml文件:

imlit.xml列表文件如下所示:

<litigation>

[...]

<h2>Affiliated Transactions/Joint Transactions</h2>

   <ul>
    <li><a href="/litigation/admin/2014/ia-3762.pdf">IA-3762</a></li>
    <li><a href="/litigation/admin/2013/ia-3654.pdf">IA-3654</a></li>
    <li><a href="/litigation/admin/2013/34-69425.pdf">34-69425</a></li>
</ul>

[...]

</ligitation>

[...]
关联交易/联合交易
[...]
我是在Basex工作的:

for $x in doc("C:\bob\dev\xquery\imlit.xml")/litigation/ul/li,
    $y in
doc("http://www.sec.gov/about/docket/sec-docket-2013.xml")/secDocket/releaseItem[releaseNumber
= $x/a]
return (<tr> <td> {$x/a} </td> <td> {data($y/date)} </td> 
<td> {data($y/subjects/subject)} </td> </tr>,  '&#xa;')
文件中的$x(“C:\bob\dev\xquery\imlit.xml”)/courtiation/ul/li,
$y英寸
文件(”http://www.sec.gov/about/docket/sec-docket-2013.xml“”/secDocket/releaseItem[发布编号]
=$x/a]
返回({$x/a}{data($y/date)}
{数据($y/受试者/受试者)},
;'))
我得到:

[...]

<tr>
  <td>
    <a href="/litigation/admin/2013/ia-3740.pdf" target="_blank">IA-3740</a>
  </td>
  <td>2013-12-17</td>
  <td>Dappah, Frank</td>
</tr>
<tr>
  <td>
    <a href="/litigation/admin/2013/ia-3729.pdf" target="_blank">IA-3729</a>
  </td>
  <td>2013-12-02</td>
  <td>Dushek, Charles J. Dushek, Charles S.</td>
</tr>

[...]
[…]
2013-12-17
达帕,弗兰克
2013-12-02
杜舍克,查尔斯J。杜舍克,查尔斯S。
[...]
但是,如果不匹配,我想插入“占位符”表行,并且还包括h2。所以我想得到如下的东西。在第一个tr“占位符”行中,imlit.xml中的“34-71069”与sec-docket-2013.xml不匹配

<h2>Compliance Programs</h2>

<tr>
  <td>
    <a href="/litigation/admin/2013/34-71069.pdf" target="_blank">34-71069</a>
  </td>
  <td>insert date</td>
  <td>insert respondent</td>
</tr>

<tr>
  <td>
    <a href="/litigation/admin/2013/34-71069.pdf" target="_blank">34-71069</a>
  </td>
  <td>2013-12-12</td>
  <td>Wayne, Mark M.</td>
</tr>
合规计划
插入日期
插入答辩人
2013-12-12
韦恩,马克M。
我尝试了以下方法,但不起作用:

for $x in doc("c:\bob\dev\xquery\imlit.xml")/litigation,
    $y in
doc("http://www.sec.gov/about/docket/sec-docket-2013.xml")/secDocket/releaseItem
return
if ($x/h2)
then $x/h2
else if ($x/ul/li/a = $y/releaseNumber)
then <tr> <td> {$x/ul/li/a} </td> <td> {data($y/date)} </td> 
<td> {data($y/subjects/subject)} </td> </tr>
else <tr> <td> {$x/ul/li/a} </td> <td> insert date </td> 
<td> insert respondent </td>     </tr>
用于文档中的$x(“c:\bob\dev\xquery\imlit.xml”)/,
$y英寸
文件(”http://www.sec.gov/about/docket/sec-docket-2013.xml“”/secDocket/releaseItem
返回
如果($x/h2)
然后是$x/h2
else if($x/ul/li/a=$y/发布编号)
然后{$x/ul/li/a}{data($y/date)}
{数据($y/受试者/受试者)}
else{$x/ul/li/a}插入日期
插入答辩人

我似乎得到了$x/h2的无限递归。我不明白条件语句应该如何工作以及查询是如何处理的。

不要自己构建连接,只需从网站上获取每轮所需的信息。我选择在没有可用文档的情况下创建一个虚拟结果,而不是在
return
子句中应用大小写区分来稍微解耦逻辑和表示

let $sec := doc("http://www.sec.gov/about/docket/sec-docket-2013.xml")
for $litigation in doc("C:\bob\dev\xquery\imlit.xml")/litigation/ul/li
(: Fetch matching document if available, otherwise create dummy result :)
let $document := $sec/secDocket/releaseItem[releaseNumber = $litigation/a]
let $document :=
  if ($document)
  then $document
  else
    <releaseItem>
      <date>insert date</date>
      <subjects>
        <subject>insert subject</subject>
      </subjects>
    </releaseItem>
return (
  <tr>
    <td>{$litigation/a}</td>
    <td>{data($document/date)}</td> 
    <td>{data($document/subjects/subject)}</td>
  </tr>,
  '&#xa;'
)
let$sec:=doc(“http://www.sec.gov/about/docket/sec-docket-2013.xml")
对于文档中的$courtiation(“C:\bob\dev\xquery\imlit.xml”)/courtiation/ul/li
(:获取匹配文档(如果可用),否则创建虚拟结果:)
let$document:=$sec/secDocket/releaseItem[releaseNumber=$诉讼/a]
让$document:=
如果($文件)
然后是$document
其他的
插入日期
插入主题
返回(
{$a诉讼/a}
{数据(文件/日期)}
{数据($document/subject/subject)}
,
“
;”
)

我认为最简单的答案是在$y for子句中添加“allowing empty”。这样,如果没有匹配项,仍然会有一个输出节点,但将$y绑定到空序列

for $x in doc("C:\bob\dev\xquery\imlit.xml")/litigation/ul/li,
    $y allowing empty in doc("http://www.sec.gov/about/docket/sec-docket-2013.xml")
    /secDocket/releaseItem[releaseNumber = $x/a]
return (
    <tr>
        <td> {$x/a} </td>
        <td> {data($y/date)} </td> 
        <td> {data($y/subjects/subject)} </td>
    </tr>,
    '&#xa;')
文件中的$x(“C:\bob\dev\xquery\imlit.xml”)/courtiation/ul/li,
$y允许在单据中为空(“http://www.sec.gov/about/docket/sec-docket-2013.xml")
/secDocket/releaseItem[releaseNumber=$x/a]
返回(
{$x/a}
{数据($y/日期)}
{数据($y/受试者/受试者)}
,
"
")
您可以在这里测试这一点(只需使用适用于Zorba的doc调用):


我希望这会有所帮助。

当在线摘要文件中有匹配项时,这会很好地工作,但是当没有匹配项时,空单元格会有意外的语法:我认为这是因为默认的序列化格式是XML。在您的例子中,您可能希望改用HTML序列化格式,它将以HTML方式输出标记。如何做到这一点取决于引擎,即使XQuery在prolog中提供了一种标准方法,引擎可能实现也可能不实现。