XQuery/HTML 表格视图
外观
< XQuery
当我们有一个具有统一表格结构的 XML 文件时,其中没有重复或复合子节点,一个通用的表格视图就非常方便。我们可以使用 XML 元素名称作为列标题。
这里有一个函数可以实现这一点。它接受一个元素序列,并创建一个 HTML 表格,每个节点对应表格中的一行。它使用 name() 函数进行一些自省,以获取第一个节点的子节点名称,从而形成列标题。对于每个节点,子节点通过节点名称访问,因此无需所有元素都存在或以与第一个节点相同的顺序排列。
xquery version "1.0";
declare function local:sequence-to-table($seq) {
(: assumes all items in $seq have the same simple element structure determined by the structure of the first item :)
<table border="1">
<thead>
<tr>
{for $node in $seq[1]/*
return <th>{name($node)}</th>
}
</tr>
</thead>
{for $row in $seq
return
<tr>
{for $node in $seq[1]/*
let $data := string($row/*[name(.)=name($node)])
return <td>{$data}</td>
}
</tr>
}
</table>
};
给定具有 统一表格结构 的 XML
以下脚本将创建 HTML 表格
xquery version "1.0";
declare option exist:serialize "method=xhtml media-type=text/html";
local:sequence-to-table ( ) {.. };
let $data := doc("furniture.xml")/*
return local:sequence-to-table($data/*)
如果您知道数据集中的第一个节点包含表格中所有列的所有元素,这种方法非常理想。
这种方法在后面的数据库示例中被用来显示计算出的序列。
如果您使用严格的 XHTML,则必须添加以下行。这将把所有 HTML 标签(<table>、<htead>、<th>、<tbody>、<tr> 和 <td>)放在正确的命名空间中。
declare base-uri "http://www.w3.org/1999/xhtml";
类似的方法可以用来将序列导出为 CSV。
xquery version "1.0";
declare option exist:serialize "method=text media-type=text/text";
declare variable $sep := ',';
declare variable $eol := ' ';
declare function local:sequence-to-csv($seq) as xs:string {
(: returns a multi-line string of comma delimited strings :)
string-join(
(string-join($seq[1]/*/name(.),$sep),
for $row in $seq
return
string-join(
for $node in $seq[1]/*
let $data := string($row/*[name(.)=name($node)])
return
if (contains($data,$sep))
then concat('"',$data,'"')
else $data
, $sep)
),$eol )
};
let $xml := doc("furniture.xml")/*
return local:sequence-to-csv($xml/*)
要直接从浏览器将文件保存到指定的文件中,以便加载到电子表格中,请添加
let $header := response:set-header("content-disposition","attachment; filename=furniture.csv")