繁体   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