for循环没有返回我的预期

时间:2014-05-17 17:44:59

标签: xml xpath xquery

这是xml文档,为了示例,我们称之为document.xml

<garage>
   <bike>
       <brand>Ducati</brand>
       <year>2000</year>
   </bike>
   <bike>
       <brand>Honda</brand>
       <year>2008</year>
   </bike>
   <bicycle>
       <brand>Trek</brand>
       <year>2004</year>
   </bicycle>
   <car>
       <brand>Porsche</brand>
       <year>1987</year>
   </car>
   <car>
       <brand>Volvo</brand>
       <year>2008</year>
   </car>
   <car>
       <brand>Ford</brand>
       <year>2012</year>
   </car>
</garage>

我想检索这个,这是所有汽车元素

      <car>
        <brand>Porsche</brand>
        <year>1987</year>
      </car>
      <car>
        <brand>Volvo</brand>
        <year>2008</year>
      </car>
      <car>
        <brand>Ford</brand>
        <year>2012</year>
      </car>

这是我的xquery文件:

     let $document:=doc('document.xml')

     for $car in $document/garage[descendant::car]
     return
     <car>
        <brand>{$car/brand/text()}</brand>
        <year>{$car/year/text()}</year>
     </car>

相反,使用这个xquery文件,我得到了这个:

    <car>
       <brand>PorscheVolvoFord</brand>
       <year>198720082012</year>
    </car>

还试过这个:

     let $document:=doc('document.xml')
     let $i:=0

     for $car in $document/garage[descendant::car]
     let $i:=$i+1
     return
     <car>
        <brand>{$car[$i]/brand/text()}</brand>
        <year>{$car[$i]/year/text()}</year>
     </car>

但只能检索索引[1]:

   <car>
      <brand>Porsche</brand>
      <year>1987</year>
   </car>

编辑:

解决了!感谢@dirkk

对我有用的是:

for $car in $document/garage[descendants::car]
return $car/element()

1 个答案:

答案 0 :(得分:1)

我不知道您使用的XQuery处理器,但您声称获得的输出对于给定的XQueries是不正确的。 $car实际上绑定到一个车库元素,因此$car/brand将是一个空结果。你必须这样做:

 for $car in $document/garage/car
 return
 <car>
    <brand>{$car/brand/string()}</brand>
    <year>{$car/year/string()}</year>
 </car>

如果您想要整个car元素,您只需执行以下操作:

$document/garage/car

此外,您应该使用string()而不是text(),它有几个好处(例如,如果您的XML中有任何回复,则不会收到回复。