xquery - 加入条件

时间:2014-02-23 02:22:10

标签: xquery

我正在尝试从链接数字列表中构建html表行,查询在线xml文件中是否存在相应的版本号,如果可用,还要添加额外的兄弟元素信息。

这是在线xml文件:http://www.sec.gov/about/docket/sec-docket-2013.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;')

我得到了:

[...]

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

[...]

但是,如果没有匹配,我想插入“占位符”表行,并且还包含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>

我尝试了以下操作,但它无效:

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 / h2的无限递归。我不了解条件语句应该如何工作以及如何处理查询。

2 个答案:

答案 0 :(得分:1)

不要自己构建联接,只需从每个回合的网站上获取必要的信息。如果没有可用的文档,我选择创建一个虚拟结果,而不是在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;'
)

答案 1 :(得分:0)

我认为最简单的答案是在$ y for子句中添加“允许空”。这样,如果没有匹配,仍然会有一个输出节点,但$ 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;')

你可以在这里测试一下(只需将文档调用改编为Zorba):http://try.zorba.io/queries/xquery/PFV2cuMlMvqyUipmtIN3IQZCzJk=

我希望这会有所帮助。