跳转到内容

XQuery/Lorum Ipsum 文本

来自维基教科书,开放世界中的开放书籍

您想创建用于测试或演示的真实大小的示例 XML。Lorum impsum 文本通常用于填充内容,并且在 XML 文件中需要的地方添加此文本将非常有用。

我们探讨了两种方法,一种基于修改文本,另一种基于修改 XML。

方法 1:字符串替换

[编辑 | 编辑源代码]

不完整的 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 模块来获取文件并通过标头控制缓存 - 这里文件正在被缓存

方法 2 - XML 替换

[编辑 | 编辑源代码]

如果要将省略号作为标记显示在文本中,则选择省略号作为标记是有问题的。转换为文本然后再转换回 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 年)
华夏公益教科书