# 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.