簡體   English   中英

XQuery:返回一個空元素,而不是包含數據的元素

[英]XQuery: Return an empty element rather then element with data

我有一個XML文檔(catalog.xml),如下所示

<catalog>
 <product dept="WMN">
  <number>557</number>
  <name language="en">Fleece_Pullover</name>
  <colorChoices>navy black</colorChoices>
 </product>
 <product dept="ACC">
  <number>563</number>
  <name language="en">Floppy_Sun_Hat</name>
 </product>
 <product dept="ACC">
   <number>443</number>
   <name language="en">Deluxe_Travel_Bag</name>
 </product>
 <product dept="MEN">
  <number>784</number>
  <name language="en">Cotton_Dress_Shirt</name>
  <colorChoices>white gray</colorChoices>
  <desc>Our <i>favorite</i> shirt!</desc>
 </product>
</catalog>

當我評估

doc("catalog.xml")//product 

我得到的結果是:

<product dept="WMN">
 <number>557</number>
 <name language="en">Fleece_Pullover</name>
 <colorChoices>navy black</colorChoices>
</product>
<product dept="ACC">
 <number>563</number>
 <name language="en">Floppy_Sun_Hat</name>
</product>
<product dept="ACC">
 <number>443</number>
 <name language="en">Deluxe_Travel_Bag</name>
</product>
<product dept="MEN">
 <number>784</number>
 <name language="en">Cotton_Dress_Shirt</name>
 <colorChoices>white gray</colorChoices>
 <desc>Our<i>favorite</i>shirt!</desc>
</product>

我們要求從xml讀取數據,文件大小可能超過1GB。 我們只需要顯示具有其屬性的節點,但不需要內部數據。

有什么辦法只能獲取如下所示的標簽。

<product dept="WMN"/>
<product dept="ACC"/>
<product dept="ACC"/>
<product dept="MEN"/>

使用XQuery,您可以僅構造一個product元素並返回dept屬性的值。

for $dept in doc("catalog.xml")/catalog/product/@dept
return <product dept="{$dept}"/>

從功能上講,這很容易,如@chrisis所示。 問題是此解決方案是否可用於1Gb輸入文檔,這取決於實現方式。 許多實現(如果輸入是文件存儲中的原始XML,而不是數據庫中的XML)將嘗試在內存中構建樹,這可能需要最多10Gb的內存,具體取決於樹表示的緊湊程度。 確實,您需要一個流媒體解決方案。

XSLT 3.0已將流內置到規范中,您可以使用代碼來確保對此進行流傳輸

<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:mode streamable="yes" on-no-match="shallow-copy"/>

<xsl:template match="product">
  <product dept="{@dept}"/>
</xsl:template>
</xsl:transform>

是否可以讓XQuery產品使用流技術完全取決於產品,因為W3C規范對此無話可說。 例如,Saxon確實具有一些在XQuery中進行流傳輸的功能,但是它們依賴於該規范的供應商擴展。

暫無
暫無

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

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