我正在尝试从链接数字列表中构建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>, '
')
我得到了:
[...]
<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的无限递归。我不了解条件语句应该如何工作以及如何处理查询。
答案 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>,
'
'
)
答案 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>,
'
')
你可以在这里测试一下(只需将文档调用改编为Zorba):http://try.zorba.io/queries/xquery/PFV2cuMlMvqyUipmtIN3IQZCzJk=
我希望这会有所帮助。