# F.47.xml2

F.47.1.弃用通知书F.47.2.功能描述F.47.3.xpath_表F.47.4.XSLT函数F.47.5.著者

这个xml2模块提供XPath查询和XSLT功能。

# F.47.1.弃用通知书

从PostgreSQL 8.3开始,核心服务器中有基于SQL/XML标准的XML相关功能。该功能包括XML语法检查和XPath查询(这是本模块的功能)等,但API完全不兼容。计划在未来版本的PostgreSQL中删除此模块,以支持更新的标准API,因此鼓励您尝试转换应用程序。如果您发现此模块的某些功能在较新的API中不可用,请向<[pgsql-hackers@lists.postgresql.org](mailto:pgsql)-hackers@lists.postgresql.org)>这样就可以解决缺陷。

# F.47.2.功能描述

表F.35显示此模块提供的功能。这些函数提供了简单的XML解析和XPath查询。

表F.35.xml2功能

作用

描述
xml_有效(文件 文本) →布尔值

解析给定文档,如果文档是格式良好的XML,则返回true。(注意:这是标准PostgreSQL函数的别名。)xml格式良好().名字xml_valid()在技术上是不正确的,因为有效性和格式良好在XML中有不同的含义。)
xpath_字符串 ( 文件 文本, 查询 文本 ) → 文本

对提供的文档计算XPath查询,并将结果强制转换为文本.
xpath_数 ( 文件 文本, 查询 文本 ) → 真实的

对提供的文档计算XPath查询,并将结果强制转换为真实的.
乌布尔 ( 文件 文本, 查询 文本 ) → 布尔值

对提供的文档计算XPath查询,并将结果强制转换为布尔值.
xpath_节点集 ( 文件 文本, 查询 文本, 头条 文本, 项目标签 文本 ) → 文本

对文档上的查询求值,并将结果包装为XML标记。如果结果是多值的,输出将如下所示:

<br/><toptag><br/><itemtag>值1,它可以是XML片段</itemtag><br/><itemtag>值2</itemtag><br/></toptag><br/><br/>

如果有的话*头条项目标签*是空字符串,则省略相关标记。
xpath_节点集 ( 文件 文本, 查询 文本, 项目标签 文本 ) → 文本

喜欢xpath_节点集(文档、查询、toptag、itemtag)但结果忽略了*头条*.
xpath_节点集 ( 文件 文本, 查询 文本 ) → 文本

喜欢xpath_节点集(文档、查询、toptag、itemtag)但结果忽略了这两个标记。
xpath_列表 ( 文件 文本, 查询 文本, 分离器 文本 ) → 文本

对文档上的查询求值,并返回由指定分隔符分隔的多个值,例如值1,值2,值3如果*分离器*是,.
xpath_列表 ( 文件 文本, 查询 文本 ) → 文本

这是上面使用的函数的包装器,作为分隔符。

# F.47.3. xpath_表

xpath_table(text key, text document, text relation, text xpaths, text criteria) returns setof record

xpath_表是一个表函数,它对一组文档中的每个文档计算一组XPath查询,并将结果作为表返回。原始文档表中的主键字段作为结果的第一列返回,以便在联接中轻松使用结果集。有关参数,请参见表F.36.

表F.36. xpath_表参数

参数 描述
钥匙 “键”字段的名称——这只是一个用作输出表第一列的字段,即,它标识每个输出行来自的记录(请参见下面关于多个值的注释)
文件 包含XML文档的字段的名称
关系 包含文档的表或视图的名称
XPath 一个或多个XPath表达式,用|
标准 WHERE子句的内容。这不能忽略,所以使用符合事实的1=1如果要处理关系中的所有行

这些参数(XPath字符串除外)只是被替换成一个简单的SQL SELECT语句,因此您有一定的灵活性——该语句是

从<relation>中选择<key>,<document>,其中<criteria>

所以这些参数可以是任何东西在这些特定地点有效。此选择的结果需要正好返回两列(除非您尝试为key或document列出多个字段),否则它将返回这两列。请注意,这种过于简单的方法需要验证任何用户提供的值,以避免SQL注入攻击。

该函数必须用于从…起表情,带着子句来指定输出列;例如

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);

这个子句定义输出表中列的名称和类型。第一个字段是“key”,其余字段对应于XPath查询。如果XPath查询多于结果列,则会忽略额外的查询。如果结果列多于XPath查询,那么额外的列将为NULL。

注意,这个例子定义了页数结果列为整数。该函数在内部处理字符串表示,因此当您说希望在输出中使用整数时,它将采用XPath结果的字符串表示,并使用PostgreSQL输入函数将其转换为整数(或任何类型的整数)条款(请求)。如果它不能做到这一点,就会产生一个错误——例如,如果结果是空的——因此,您可能希望继续使用文本如果您认为数据有任何问题,请将其作为列类型。

召唤选择声明不一定要公正挑选*-它可以按名称引用输出列,也可以将它们连接到其他表。该函数生成一个虚拟表,您可以使用它执行任何操作(例如,聚合、加入、排序等)。所以我们还可以:

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.47.3.1.多值结果

这个xpath_表函数假定每个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
### F.47.4. XSLT Functions

 The following functions are available if libxslt is installed:

#### F.47.4.1. `xslt_process`

[]()

xslt_进程(文本文档、文本样式表、文本参数列表)返回文本

 This function applies the XSL stylesheet to the document and returns the transformed result. The `paramlist` is a list of parameter assignments to be used in the transformation, specified in the form `a=1,b=2`. Note that the parameter parsing is very simple-minded: parameter values cannot contain commas!

 There is also a two-parameter version of `xslt_process` which does not pass any parameters to the transformation.

### F.47.5. Author

 John Gray `<[jgray@azuli.co.uk](mailto:jgray@azuli.co.uk)>`

 Development of this module was sponsored by Torchbox Ltd. (www.torchbox.com). It has the same BSD license as PostgreSQL.