[英]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.