2

我是 XQuery 的新手,我只是想检查并确保我已经正确地解决了最初的几个问题,看看是否有任何反馈。

查找价格低于 100 的打印机元素。

let $products := doc("products.xml")
for $e in $products/Products/Maker/Printer
where $e/Price < 100
return $e

做同样的事情,但现在生成由标签包围的这些元素的序列。

let $products := doc("products.xml")
for $e in $products/Products/Maker/Printer
where $e/Price < 100
return <CheapPrinters>$e</CheapPrinters>

产品.xml

<Products>
<Maker name = "A">
  <PC model = "1001" price = "2114">
    <Speed>2.66</Speed> 
    <RAM>1024</RAM> 
    <HardDisk>250</HardDisk>
  </PC>
  <PC model = "1002" price = "995">
     <Speed>2.10</Speed>
     <RAM>512</RAM>
     <HardDisk>250</HardDisk>
  </PC>
  <Laptop model = "2004" price = "1150">
     <Speed>2.00</Speed>
     <RAM>512</RAM>
     <HardDisk>60</HardDisk>
     <Screen>13.3</Screen>
  </Laptop>
  <Laptop model = "2005" price = "2500">
     <Speed>2.16</Speed>
     <RAM>1024</RAM>
     <HardDisk>120</HardDisk>
     <Screen>17.0</Screen>
  </Laptop>
</Maker>
<Maker name = "E">
  <PC model = "1011" price = "959">
 <Speed>1.86</Speed>    
 <RAM>2048</RAM>    
 <HardDisk>160</HardDisk>   
  </PC> 
  <PC model = "1012" price = "649">
 <Speed>2.80</Speed>    
 <RAM>1024</RAM>    
 <HardDisk>160</HardDisk>   
  </PC> 
  <Laptop model = "2001" price = "3673">
 <Speed>2.00</Speed>
 <RAM>2048</RAM>    
 <HardDisk>240</HardDisk>   
 <Screen>20.1</Screen>  
  </Laptop> 
  <Printer model = "3002" price =   "239">
     <Color>false</Color>
     <Type>laser</Type> 
  </Printer>
</Maker>    
<Maker name = "H">  
  <Printer model = "3006" price = "100">
     <Color>true</Color>
     <Type>ink-jet</Type>   
  </Printer>    
  <Printer model = "3007" price = "200">
     <Color>true</Color>
     <Type>laser</Type>
  </Printer>
 </Maker>
 </Products>
4

1 回答 1

1

过滤结果

查找价格低于 100 的打印机元素。

没有比 100 美元便宜的打印机。我用 200 作为我的例子。:)

您正在查询一个元素,而不是属性。@在属性名称前添加一个。此外,XQuery 区分大小写,您必须使用@price

let $products := doc("products.xml")
for $e in $products/Products/Maker/Printer
where $e/@price < 200
return $e

您还可以尝试更短的 XPath 等效项(它是 XQuery 的子集):

doc("products.xml")/Products/Maker/Printer[@price<200]

元素构造

做同样的事情,但现在生成由标签包围的这些元素的序列。

Now you will have to use "real" XQuery. You example is mostly fine (apart from the error fixed above), but currently you will return "$e" for each line. There are two ways to construct elements, also have a look at this handy tutorial:

  1. Curly brackets

    return <CheapPrinters>{$e}</CheapPrinters>

  2. Element Constructors

    return element {"CheapPrinters"} {$e}

于 2012-06-01T17:27:44.417 回答