簡體   English   中英

在XQuery中修飾XML數據源

[英]Embellish XML datasource in XQuery

我正在使用BaseX,它實現了XQuery 3.0。

如何在XQuery中修飾XML數據源,而不必鍵入要包含的所有元素? 例如,考慮以下XML:

<X>
  <name>The root</name>
  <Y>
     <name> Level 1</name>
     <Z>
         <name>Level 2a</name>
         <value>1</value>
     </Z>
  </Y>
  <Y>
     <name>Level 1b</name>
     <Z>
         <name>Level 2b</name>
         <value>2</value>
     </Z>
  </Y>
</X>

我想在每個級別上添加所有值的總和,如下所示:

<X>
  <name>The root</name>
  <value>3</value>
  <Y>
     <name> Level 1</name>
     <value>1</value>
     <Z>
         <name>Level 2a</name>
         <value>1</value>
     </Z>
  </Y>
  <Y>
     <name>Level 1b</name>
     <value>2</value>
     <Z>
         <name>Level 2b</name>
         <value>2</value>
     </Z>
  </Y>
</X>

我可以這樣使用XQuery:

for $x in /X
return
<X>{
  $x/name,
  <value>{sum($x//value)}</value>,
  for $y in $x/Y
  return
  <Y>{
    $y/name,
    <value>{sum($y//value)}</value>,
    $y/Z
  }</Y>
}</X>

但是,當我不得不重復很多元素時,這將非常繁瑣。 有沒有一種方法可以得到此結果而不必鍵入要保留在結果集中的所有屬性和元素?

你當然可以! XQuery非常強大。 更好的是,BaseX不僅支持XQuery 3.0,而且還支持XQuery Update,我想在這里更重要。

XQuery本身只是一種查詢語言。 因此,如果要在某些位置插入元素,則始終必須像在示例中一樣重新創建整個元素。 但是,XQuery Update添加了一些結構來實際更新文檔,例如,您可以使用它來更新數據庫中的值。 如果只想對值進行本地轉換,則有轉換表達式

由於規范中用於此目的的結構非常龐大,因此我們引入了特定於BaseX的關鍵字update ,您可以使用該關鍵字來轉換XML文檔。

因此,使用此查詢可以如下所示:

./X update (
  insert node <value>{sum(.//value)}</value> after ./name,
  for $y in ./Y
  return insert node <value>{sum($y//value)}</value> after $y/name
)

當然,根據元素的重復方式(從您的問題中可以很清楚地看出),您現在可以使用它例如在適當的位置遞歸插入這樣的節點。 這樣做的另一個提示:如果要動態選擇一個元素,有時有時需要編寫更好的/X而不是/*[local-name() = 'X']因為現在不必使用元素名稱靜態的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM