<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # F.42\. xml2 `xml2`模塊提供XPath查詢和XSLT功能。 ## F.42.1\. 棄用通知 從PostgreSQL 8.3開始,在內核服務器中有一個基于SQL/XML標準的XML相關的功能。 這個功能包含了XML語法檢查和XPath查詢,這也是這個模塊的包含的,甚至更多,不過API一點也不兼容。 計劃在未來的PostgreSQL版本中刪除這個模塊,支持新的標準的API,所以鼓勵你嘗試轉換你的應用。 如果你發現這個模塊的某些功能在一個適當形式的更新的API中不可用, 請解釋你的問題到`&lt;[pgsql-hackers@postgresql.org](mailto:pgsql-hackers@postgresql.org)&gt;`,以便解決這個缺陷。 ## F.42.2\. 功能說明 [Table F-32](#calibre_link-1981)顯示了這個模塊提供的函數。 這些函數提供了簡單的XMP解析和XPath查詢。所有參數都是`text`類型的, 所以為了簡化沒有顯示。 **Table F-32\. 函數** | 函數 | 返回 | 描述 | | --- | --- | --- | | `xml_is_well_formed(document)` | `bool` | 解析它的參數中的文件正文,并且如果文件是格式良好的XML則返回真。 (注意:在PostgreSQL 8.2之前,這個函數稱為`xml_valid()`。 這是錯誤的名字,因為在XML中有效性和良構性有不同的含義。 老的名字仍然可用,但是已經廢棄了。) | | `xpath_string(document, query)` | `text` | 這個函數在提供的文件上評估XPath查詢,并轉換結果到指定的類型。 | | `xpath_number(document, query)` | `float4` | | `xpath_bool(document, query)` | `bool` | | `xpath_nodeset(document, query, toptag, itemtag)` | `text` | 在文件上評估查詢并將結果包裝在XML標簽中。如果結果是多值的,那么輸出將看起來像:`&lt;toptag&gt;` `&lt;itemtag&gt;Value 1 which could be an XML fragment&lt;/itemtag&gt;` `&lt;itemtag&gt;Value 2....&lt;/itemtag&gt;` `&lt;/toptag&gt;` 如果`toptag`或`itemtag`中的任意一個是空字符串,那么省略相關的標簽。 | | `xpath_nodeset(document, query)` | `text` | 類似于`xpath_nodeset(document, query, toptag, itemtag)`,但是結果省略兩個標簽。 | | `xpath_nodeset(document, query, itemtag)` | `text` | 類似于`xpath_nodeset(document, query, toptag, itemtag)`,但是結果省略toptag。 | | `xpath_list(document, query, separator)` | `text` | 這個函數返回由指定的分隔符分開的多個值,例如如果分隔符是`,`, 返回值是`Value 1,Value 2,Value 3`。 | | `xpath_list(document, query)` | `text` | 這是一個對于使用`,`作為分隔符的以上函數的包裝器。 | ## F.42.3\. `xpath_table` ``` xpath_table(text key, text document, text relation, text xpaths, text criteria) returns setof record ``` `xpath_table`是一個表函數,在每一組文檔上計算一組XPath查詢, 并作為一個表返回結果。原始文檔表的主鍵字段作為結果的第一個字段返回, 因此結果集可以容易的用于連接。參數在[Table F-33](#calibre_link-1982)中描述。 **Table F-33\. `xpath_table` 參數** | 參數 | 描述 | | --- | --- | | `key` | "key"字段的名字—這只是用作輸出表的第一個字段,也就是, 它識別每個傳來的輸出行的記錄(請參見下面關于多行值的注釋) | | `document` | 包含XML文檔的字段名 | | `relation` | 包含文檔的表或視圖的名字 | | `xpaths` | 一個或多個XPath表達式,由`&#124;`分隔 | | `criteria` | WHERE子句的內容。這個不能省略,所以如果你想要在關系中處理所有的行, 那么使用`true`或`1=1` | 這些參數(除了XPath字符串)只是代替一個純SQL SELECT語句, 所以你有一些靈活性—該語句是 `SELECT &lt;key&gt;, &lt;document&gt; FROM &lt;relation&gt; WHERE &lt;criteria&gt;` 所以這些參數可以是_任何_在這些特定位置的有效值。 這個SELECT的結果需要返回正好兩個字段(除非你嘗試為key或document列出多個字段)。 注意這個簡單的方法需要驗證任何用戶提供的值,以避免SQL注入攻擊。 該函數必須用于`FROM`表達式中,用一個`AS`子句指定輸出字段;例如 ``` SELECT * FROM xpath_table('article_id', 'article_xml', 'articles', '/article/author|/article/pages|/article/title', 'date_entered > ''2003-01-01'' ') AS t(article_id integer, author text, page_count integer, title text); ``` `AS`子句定義輸出表中字段的名字和類型。第一個是"key"字段, 剩余的對應于XPath查詢。如果XPath查詢多于結果字段,那么額外的查詢將被忽略。 如果結果字段多于XPath查詢,那么額外的字段將為空。 請注意,這個示例定義`page_count`的結果字段為一個整數。 該函數內部處理字符串的表示,所以當你說你在輸出中想要一個整數時, 它將接收XPath結果的字符串表示,并使用PostgreSQL輸入函數將它轉換為一個整數 (或者任何`AS`子句要求的類型)。如果它不能這么做則導致一個錯誤— 例如,如果結果為空—所以如果你認為你的數據有任何問題, 你可能想要堅持`text`作為該字段的類型。 調用的`SELECT`語句不需要只是`SELECT *`— 它可以通過名字或鏈接輸出字段到其他的表引用輸出字段。 該函數產生一個虛擬表,用該虛擬表你可以執行任何你想要的操作 (例如,聚集、鏈接、排序等等)。所以我們也可以將: ``` SELECT t.title, p.fullname, p.email FROM xpath_table('article_id', 'article_xml', 'articles', '/article/title|/article/author/@id', 'xpath_string(article_xml,''/article/@date'') > ''2003-03-20'' ') AS t(article_id integer, title text, author_id integer), tblPeopleInfo AS p WHERE t.author_id = p.person_id; ``` 作為一個更復雜的示例。當然,為了方便,你可以將所有這些包裝到一個視圖中。 ### F.42.3.1\. 多值的結果 `xpath_table`函數假設每個XPath查詢的結果可能是多值的, 所以該函數返回的行數可能和輸入文檔的行數不同。 返回的第一行包含每個查詢的第一個結果,第二行包含每個查詢的第二個結果。 如果其中的一個查詢比其他查詢的值少,那么將返回空值。 在某些情況下,用戶知道一個給定的XPath查詢將只返回一個結果(可能是一個唯一文檔標識符)— 如果和返回多個結果的XPath查詢一起使用,那么唯一值結果將只在結果的第一行出現。 這個問題的解決方法是使用該關鍵字段作為一個更簡單的XPath查詢連接的一部分。 示例: ``` CREATE TABLE test ( id int PRIMARY KEY, xml text ); INSERT INTO test VALUES (1, '<doc num="C1"> <line num="L1"><a>1</a><b>2</b><c>3</c></line> <line num="L2"><a>11</a><b>22</b><c>33</c></line> </doc>'); INSERT INTO test VALUES (2, '<doc num="C2"> <line num="L1"><a>111</a><b>222</b><c>333</c></line> <line num="L2"><a>111</a><b>222</b><c>333</c></line> </doc>'); SELECT * FROM xpath_table('id','xml','test', '/doc/@num|/doc/line/@num|/doc/line/a|/doc/line/b|/doc/line/c', 'true') AS t(id int, doc_num varchar(10), line_num varchar(10), val1 int, val2 int, val3 int) WHERE id = 1 ORDER BY doc_num, line_num id | doc_num | line_num | val1 | val2 | val3 ----+---------+----------+------+------+------ 1 | C1 | L1 | 1 | 2 | 3 1 | | L2 | 11 | 22 | 33 ``` 要在每個行上獲得`doc_num`,解決方法是使用兩個`xpath_table` 的調用并連接結果: ``` SELECT t.*,i.doc_num FROM xpath_table('id', 'xml', 'test', '/doc/line/@num|/doc/line/a|/doc/line/b|/doc/line/c', 'true') AS t(id int, line_num varchar(10), val1 int, val2 int, val3 int), xpath_table('id', 'xml', 'test', '/doc/@num', 'true') AS i(id int, doc_num varchar(10)) WHERE i.id=t.id AND i.id=1 ORDER BY doc_num, line_num; id | line_num | val1 | val2 | val3 | doc_num ----+----------+------+------+------+--------- 1 | L1 | 1 | 2 | 3 | C1 1 | L2 | 11 | 22 | 33 | C1 (2 rows) ``` ## F.42.4\. XSLT 函數 如果安裝了libxslt,那么下列的函數是可用的: ### F.42.4.1\. `xslt_process` ``` xslt_process(text document, text stylesheet, text paramlist) returns text ``` 這個函數應用XSL樣式表到文檔并返回轉換了的結果。`paramlist` 是一個在轉換中使用的參數分配列表,以格式`a=1,b=2`指定。 請注意,參數分析是非常簡單的:參數值不能包含逗號! 也有一個兩參數的`xslt_process`版本,不傳遞任何參數到轉換。 ## F.42.5\. 作者 John Gray `&lt;[jgray@azuli.co.uk](mailto:jgray@azuli.co.uk)&gt;` 這個模塊的發展是由Torchbox Ltd. (www.torchbox.com)贊助的。 它和PostgreSQL有一樣的BSD許可證。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看