跳转到内容

XQuery/HTML 表格视图

来自维基教科书,开放书籍,开放世界
(重定向自 XQuery/Table View)

当我们有一个具有统一表格结构的 XML 文件时,其中没有重复或复合子元素,通用表格视图非常方便。我们可以使用 XML 元素名称作为列标题。

序列作为 HTML 表格

[编辑 | 编辑源代码]

这是一个实现此目的的函数。它接受一个元素序列,并创建一个 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

[编辑 | 编辑源代码]

类似的方法可用于将序列导出为 CSV。

xquery version "1.0";
declare option exist:serialize "method=text media-type=text/text";
declare variable  $sep := ',';
declare variable  $eol := '&#10;';

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")
华夏公益教科书