<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>
可悲的是,它不起作用。请,如果您要帮助我,请尝试最简单的答案。我是新手,对此我不太了解。
<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:
let $i:=min(//pizzas/pizza/precio)
指向7.95。for $e in //pizzas
返回<pizzas>
个元素。for $e in //pizzas where $e/pizza/precio=$i
where子句始终为true,将返回包含<pizzas>
元素的父级<pizza>
元素。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)"