跳轉到內容

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 年)
華夏公益教科書