XQuery/转换样式
外观
< XQuery
您有一些文档需要从一种格式转换为另一种格式。您想知道什么方法最适合您的情况。
有几种不同的方法或转换样式可用于将文档从一种格式转换为另一种格式。每种方法都有其基于您要转换的数据类型的优点或缺点。
- 模板方法
- 过滤器方法
- 类型转换方法
- XSLT 方法
- 方法组合
此方法类似于我们用来将大型文件拆分为多个较小文件的“拆分”函数。总体思路是创建一个新的内联模板,并通过指定对旧文档值的路径引用来填充来自旧文档的值。
例如
(: read in a document in the old format :)
let $old-format := doc('old-file.xml')/root
(: create a new template in the new format that you want to use :)
let $template :=
<new-format>
<new-element>{$old-format/path-to-old-element/text()}</new-element>
<new-element2>{$old-format/path-to-old-element2/text()}</new-element2>
</new-format>
(: you can comment this out when you are debugging :)
let $store := xmldb:store($new-collection, 'new-file.xml', $template)
return $template
此方法使用一系列“节点过滤器”,这些过滤器对文档的每个节点使用递归。如果只进行一些更改,例如重命名几个元素、添加几个元素或插入几个新属性,则节点过滤器方法是理想的选择。
以下文章介绍了节点过滤器:XQuery/过滤节点
此方法非常适合您有一组规则用于将每个元素转换为一个或多个其他元素的情况。它有点复杂,因为每个元素都可以有自己的转换规则。对于具有一致但嵌套结构的大型文档,它是最通用的,并且最类似于任何在 XSLT 转换中使用模板匹配规则的人。
如果您有现有的 XSLT 转换,您也可以在您的转换系统中使用它。XSLT 的问题是它不使用 eXist 索引系统,并且对大型文档的转换速度可能非常慢。XSLT 程序还必须仔细设置才能包含正确的导入语句,这在 XML 数据库中可能会变得非常复杂。此外,很少有支持扩展(如数学函数)的开源 XSLT 2.0 软件系统。
如果您有很多转换,您可以使用方法组合。大型系统通常使用基本的类型转换库,然后使用过滤器添加自定义。