eXide的披萨

问题描述 投票:0回答:2
<pizzeria>
    <pizzas>
        <pizza id="p001">
            <nombre>Carbonara</nombre>
            <precio>8.45</precio>
            <disponible>si</disponible>
        </pizza>
        <pizza id="p002">
            <nombre>Barbacoa</nombre>
            <precio>9.25</precio>
            <disponible>si</disponible>
        </pizza>
        <pizza id="p003">
            <nombre>Gourmet</nombre>
            <precio>7.95</precio>
            <disponible>no</disponible>
        </pizza>
        <pizza id="p004">
            <nombre>Boloñesa</nombre>
            <precio>10.45</precio>
            <disponible>si</disponible>
        </pizza>
    </pizzas>
</pizzeria>

我需要这样说:Ofrecemos“披萨盘点”披萨是“最低价格”(“最便宜的披萨的名称”)。仅考虑可用的比萨饼(它们在不合理的元素中包含值“ si”)。

结果必须是“ Ofrecemos 3比萨设计8.45€(卡波纳拉)”

我尝试过此代码:

<table>
 {let $i:=min(doc("/db/exercise/pizzeria.xml")//pizzas/pizza/precio)
 for $e in doc("/db/exercise/pizzeria.xml")//pizzas
 where $e/pizza/precio=$i
 return
   (<caption>
      Ofrecemos {count($e/pizza[disponible="si"])} pizzas desde {min($e/pizza[.//disponible="si"]/precio)}€ ({$e/pizza[.//disponible="si"]/nombre/text()})
   </caption>)
 }
</table>

可悲的是,它不起作用。请,如果您要帮助我,请尝试最简单的答案。我是新手,对此我不太了解。

html xpath xquery
2个回答
1
投票
<caption>
 {
     let $h := /pizzeria/pizzas/pizza[disponible = "si"]    
     let $i := min($h/precio)
     let $j := ($h[precio = $i]/nombre)[1]
     let $k := count($h)
     return
        concat("Ofrecemos ", $k, " pizzas desde ", $i, "€ ", $j)
 }
 </caption>

小提琴https://xqueryfiddle.liberty-development.net/bFDbxkY

进行修改以选择一个名称,以防您发现多个具有相同最低价值的比萨饼。

===========================

关于您的xquery:

  1. let $i:=min(//pizzas/pizza/precio)指向7.95。
  2. [for $e in //pizzas返回<pizzas>个元素。
  3. [for $e in //pizzas where $e/pizza/precio=$i where子句始终为true,将返回包含<pizzas>元素的父级<pizza>元素。
  4. 您的版本已修改:https://xqueryfiddle.liberty-development.net/bFDbxkY/11

0
投票

XPath 1.0解决方案:

concat('"Ofrecemos ',count(//pizza[disponible[.="si"]])," pizzas desde ",//precio[following-sibling::disponible[.="si"]][not(.>//precio[following-sibling::disponible[.="si"]])]/text(),"€(",//precio[following-sibling::disponible[.="si"]][not(.>//precio[following-sibling::disponible[.="si"]])]/preceding-sibling::*[1]/text(),')"')

输出:"Ofrecemos 3 pizzas desde 8.45€(Carbonara)"

© www.soinside.com 2019 - 2024. All rights reserved.