跳到內容

XQuery/HTML 表格檢視

來自華夏公益教科書,開放的書籍,開放的世界

當我們有一個具有統一表格結構的 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")
華夏公益教科書