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 年)