将映射的XPath表达式转换为包含关系数据的XML

4

背景

使用XML和XSL创建网站。PostgreSQL数据库结构化表示所需的XML文档。PostgreSQL提供了许多与XML相关的函数,列在:

http://www.postgresql.org/docs/current/static/functions-xml.html

这是一个不同于将XML转换为数据库的问题,对此有许多解决方案。

更新: 为了澄清,此问题不涉及使用给定URL中列出的XML函数。它涉及基于将数据库表(和JOIN条件)映射到XPath表达式的通用解决方案来创建XML文档。

更新: 进一步澄清,XQuery用于搜索XML文档,就像它们是数据库一样 - 类似于XPath和SQL之间的交叉。我有一个数据库,想要生成一个XML文档。XML文档的结构应以XPath表达式映射到表和列的方式给出,而不是以XML函数的方式给出。

问题

我想解决的问题是使用PostgreSQL将表行中的值映射到XPath值。下面的示例用于说明问题。

示例

XPath映射,这就是这个问题的全部内容:

root               > people
person             > person
person.first_name -> name/first
person.last_name  -> name/last
person.age        -> [@age]
account.person_id => person.person_id
account            > person/account
account.number    -> [@id]

一个 PERSON 表可能如下:

person_id | first_name | last_name | age
      123 | Peter      | Parker    | 18
      456 | James      | Jameson   | 42

而一个 ACCOUNT 表可能如下:

account_id | person_id | number
         1 |       123 | 123456789

使用XPath映射查询数据库将生成以下XML文档:
<people>
  <person age="18">
    <name>
      <first>Peter</first>
      <last>Parker</last>
    </name>
    <account id="123456789" />
  </person>
  <person age="42">
    <name>
      <first>James</first>
      <last>Jameson</last>
    </name>
  </person>
</people>

在这种情况下,James Jameson没有账户,因此相应的XML元素(account)不包括在最终文档中。
这是一个困难的问题,完全的解决方案并非必要。解决80%的简单表映射到简单的XML元素和属性的方案就足够了。
问题:
如何创建一个SQL语句(或过程),根据数据库表格(和一些JOIN操作)与XPaths(或类似的内容)的映射来返回XML文档以执行数据转换?
是否有任何技术或开源实现已经执行这样的任务?
谢谢!
相关链接 商业软件
1个回答

3
它应该使用XML生成函数。
postgres=# select xmlelement(name "people", xmlagg(xmlelement(name "person", xmlattributes(age), xmlforest(first_name as first, last_name as last)))) from person;
                                                                      xmlelement                                                                      
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 <people><person age="18"><first>Peter</first><last>Parker</last></person><person age="42"><first>James</first><last>Jameson</last></person></people>

(1行)

还有其他可能性可供使用

postgres=# select table_to_xml('person', true, false, '');
                          table_to_xml                          
────────────────────────────────────────────────────────────────
 <person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">↵
                                                               ↵
 <row>                                                         ↵
   <first_name>Peter</first_name>                              ↵
   <last_name>Parker</last_name>                               ↵
   <age>18</age>                                               ↵
 </row>                                                        ↵
                                                               ↵
 <row>                                                         ↵
   <first_name>James</first_name>                              ↵
   <last_name>Jameson</last_name>                              ↵
   <age>42</age>                                               ↵
 </row>                                                        ↵
                                                               ↵
 </person>                                                     ↵

(1 row)

下一步应该进行一些XSLT转换,以达到您的目标格式 - 在这里会有更专业的XSLT专家来帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接