XQuery/Lorum Ipsum 文本
外观
< XQuery
您想创建用于测试或演示的真实大小的示例 XML。Lorum impsum 文本通常用于填充内容,并且在 XML 文件中需要的地方添加此文本将非常有用。
我们探讨了两种方法,一种基于修改文本,另一种基于修改 XML。
不完整的 XML 文件中要放置 lorum ipsum 文本的地方用省略号 "..." 标记。读取 XML 文件,将其序列化为字符串,将其拆分为多个部分,然后重新组装这些部分,并在省略号的位置添加随机选择的 lorum ipsum 文本部分。然后将字符串转换回 XML 以输出。基本 lorum ipsum 文本存储为 XML 文件
http://www.cems.uwe.ac.uk/xmlwiki/apps/lorumipsum/words.xml
- XML <> 字符串转换:脚本使用 exist util 模块(util:serialize 和 util:parse)中的两个函数来在 XML 和字符串之间转换。这允许在将 XML 文本转换回 XML 之前将其作为简单字符串进行操作
- 递归:将随机文本插入原始字符串需要递归函数
- 正则表达式:使用正则表达式来标记 lorum ipsum 文本和包含省略号的不完整 XML 文件
declare function local:join-random($parts,$words) {
if (count($parts) > 1)
then
let $randomtext :=string-join(subsequence ($words,util:random(100), util:random(100))," ")
return string-join(($parts[1],$randomtext, local:join-random(subsequence($parts,2), $words)),"")
else $parts
};
let $lorumipsum := doc("/db/Wiki/apps/lorumipsum/words.xml")/lorumipsum
let $words := tokenize($lorumipsum,"\s+")
let $file := request:get-parameter("file",())
let $doc := doc($file)/*
let $docText := util:serialize($doc,"media-type=text/xml method=xml")
let $parts := tokenize($docText, "\.\.\.")
let $completedText := local:join-random($parts,$words)
return util:parse($completedText)
- lorum ipsum 文本通过对空格进行标记化而被拆分为单词
- 获取不完整的 XML 并访问根元素。
- 使用 util:serialize 函数将此元素转换为字符串,然后使用模式 "\.\.\.\" 进行标记化(不是 "...",因为在正则表达式中 . 表示任何单个字符)
- 递归函数 join-random() 将一系列字符串中的第一个与一段随机的 lorum ipsum 文本连接起来,并以类似的方式将其余字符串连接起来
- 使用 util:parse() 将扩展后的文本转换回 XML 元素
- 可以生成 lorum ipsum 文本本身,而不是存储它。
- 可以将脚本参数化为 lorum impsum 文件,允许使用不同的,可能更真实的文本。
- lorum ipsum 单词作为参数传递给递归函数。这可以在全局变量中定义,而不是传递参数。
- 最好使用 httpclient 模块来获取文件并通过标头控制缓存 - 这里文件正在被缓存
如果要将省略号作为标记显示在文本中,则选择省略号作为标记是有问题的。转换为文本然后再转换回 XML 会增加开销。
另一种方法是使用 XML 元素,例如 <ipsum/> 来标记要出现 ipsum lorum 文本的位置,并将每个出现的位置替换为一个随机单词。可以通过修改 XQuery/过滤节点 中讨论的标识转换来实现对 XML 树中任何位置的特定元素的替换。
- 递归 - 复制任意 XML 树,将给定元素替换为随机文本。
declare variable $lorumipsum := doc("/db/Wiki/apps/lorumipsum/words.xml")/lorumipsum;
declare variable $words := tokenize($lorumipsum,"\s+");
declare variable $marker:= "ipsum";
declare function local:copy-with-random($element as element()) as element() {
element {node-name($element)}
{$element/@*,
for $child in $element/node()
return
if ($child instance of element())
then
if (name($child) = $marker)
then subsequence($words,util:random(100),util:random(100))
else local:copy-with-random($child)
else $child
}
};
let $file := request:get-parameter("file",())
let $root := doc($file)/*
return
local:copy-with-random($root)
- ipsum lorum 单词序列保存在全局变量中,以避免将其作为参数传递给递归函数。
- copy-with-random() 函数递归地将树中的元素和项目复制到新的树中
- 当遇到名为“ipsum”的元素时,将返回一段 ipsum lorem 文本,而不是原始元素。
第二种方法更简单。性能基本相同。
- 示例 XML 来自“搜索:图形网页指南”,肯·库普兰德,劳伦斯·金出版公司(2002 年)